EJB 3 & Swing:如何提高 GUI 响应能力?



我正在制作基于EJB 3技术的Swing数据库应用程序。我使用的是Netbeans 7.0.1。当程序启动时,它从数据库中获取所有数据:

    private javax.persistence.Query spareQuery;
    private java.util.List<Spares> spareList;
    ...
    spareQuery = entityManager.createQuery("SELECT s FROM Spares s ORDER BY s.id");
    spareList = org.jdesktop.observablecollections.ObservableCollections.
                observableList(spareQuery.getResultList());

从数据库中获取所有数据会导致启动过程显著暂停。目前,我需要一个javax.persistence.Query接口的包装器,它将执行以下操作:

  1. 初始化:

    spareQuery = entityManager.createQuery("SELECT s FROM Spares s ORDER BY s.id");
    spareQuery = new MyQueryWrapper ( spareQuery );
    
  2. 主要部分!之后当这个调用:

    spareList = org.jdesktop.observablecollections.ObservableCollections.
                observableList(spareQuery.getResultList());
    

Query实例不应等待从服务器接收到的所有数据,而应将查询拆分为块,并在检索到的每个块之后将数据添加到列表中(由于列表是可观察的,因此数据的每一部分都将出现在关联的JTable中)。因此,我们将实现软启动和快速启动。

因此,工作的逻辑应该是这样的:

  1. SELECT s FROM Spares s ORDER BY s.id WHERE s.id BETWEEN 1 and 20
  2. 将数据添加到列表中
  3. SELECT s FROM Spares s ORDER BY s.id WHERE s.id BETWEEN 80 and 100
  4. 将数据添加到列表中

问题:是否有任何库可以取代(包装)EntityManagerQuery或其他东西,使用EJB3技术从数据库中实现软异步数据提取?

为什么需要一个库。只需在另一个线程中启动EntityManager实例和Query执行,然后在返回值可用时将其带回Swing的线程。您可以使用SwingWorker或ExecutorService来实现这一点,但对于这样一个简单的任务,您最好只启动一个带有回调的线程。

最新更新