2012-09-26 90 views
6

我正在使用帶有buildin OpenJPA 1.2.3和Oracle數據庫的Websphere Application Server 7。我有以下實體:性能OpenJPA查詢(3000+記錄)很慢

@NamedNativeQuery(name=Contract.GIVE_ALL_CONTRACTS, 
     query="SELECT number, name \n" + 
      "FROM contracts \n" + 
      "WHERE startdate <= ?1 \n" + 
      "AND enddate > ?1", 
      resultSetMapping = Contract.GIVE_ALL_CONTRACTS_MAPPING) 
    @SqlResultSetMapping(name = Contract.GIVE_ALL_CONTRACTS_MAPPING, 
     entities = { @EntityResult(entityClass = Contract.class, fields = { 
      @FieldResult(name = "number", column = "number"), 
      @FieldResult(name = "name", column = "name") 
     }) 
    }) 
    @Entity 
    public class Contract { 
     public static final String GIVE_ALL_CONTRACTS = "Contract.giveAllContracts"; 
     public static final String GIVE_ALL_CONTRACTS_MAPPING = "Contract.giveAllContractsMapping"; 

     @Id 
     private Integer number; 
     private String name; 

     public Integer getNumber() { 
     return number; 
     } 
     public String getName() { 
     return name; 
     } 
    } 

以下代碼來獲取合同:

Query query = entityManager.createNamedQuery(Contract.GIVE_ALL_CONTRACTS); 
query.setParameter(1, referenceDate); 

List contracts = query.getResultList(); 
entityManager.clear(); 

return contracts; 

檢索到的合同被傳遞到web服務。

在Oracle開發人員中執行此查詢需要大約0.35秒的3608記錄。 對query.getResultList()的調用大約需要4秒鐘。

在實體的構造函數中使用記錄器時,它會記錄約10-20個使用相同時間戳創建的實體。然後0,015秒它做別的事情。我猜OpenJPA的東西。

有沒有辦法加快OpenJPA?或者是唯一的解決方案緩存?

+1

我建議你使用分析器。 – user1516873

回答

3

對象創建可能會在性能上有所公平。在服務器中運行代碼時,不僅要查詢數據庫,還要分配內存併爲每行創建一個新的Contract對象。擴展的堆或垃圾收集週期可能會計算您觀察到的空閒時間段。

我建議你瀏覽OpenJPA文檔,瞭解如何處理large results sets

+1

openjpa.FetchBatchSize非常重要。在Oracle中,它(僅用於?)只有10. –

+0

我已經添加了以下代碼:'OpenJPAQuery kq = OpenJPAPersistence.cast(query); JDBCFetchPlan fetch =(JDBCFetchPlan)kq.getFetchPlan(); fetch.setFetchBatchSize(100); fetch.setResultSetType(ResultSetType.SCROLL_INSENSITIVE); fetch.setFetchDirection(FetchDirection.FORWARD); fetch.setLRSSizeAlgorithm(LRSSizeAlgorithm.LAST);'當我調用web服務時,它返回一個+/- 600ms的結果。這真的很快!謝謝你的提示 –

+0

你也可以使用: 'query.setHint(「openjpa.FetchPlan.FetchBatchSize」,「100」); query.setHint(「openjpa.FetchPlan.ResultSetType」,「SCROLL_INSENSITIVE」); query.setHint(「openjpa.FetchPlan.LRSSizeAlgorithm」,「LAST」);' –

0

我建議你下載VisualVM並設置相關軟件包的分析。 VisualVM可以顯示在不同方法中花費的時間,從理論上講,這些方法總共可以達到0.35秒。您將能夠分析代碼,OpenJPA和網絡IO之間的總時間分配。這將幫助您確定瓶頸。

+0

除非它是網絡開銷。這可能是。 –

+0

@Natan Cox Network可以完美地看到,只需將java.io. *包含到配置文件包中即可。數據庫通信將被視爲一種io.read的東西,所以我不記得確切的方法名稱。 – jabal