[英]Performance OpenJPA query (3000+ records) is slow
我正在使用帶有buildin OpenJPA 1.2.3和Oracle數據庫的Websphere Application Server 7。 我有以下實體:
@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? 或者是唯一的緩存解決方案?
對象創建可能在性能影響方面有其公平的份額。 在服務器中運行代碼時,您不僅要查詢數據庫,還要為每行分配內存並創建新的Contract對象。 擴展堆或垃圾回收周期可能會計入您觀察到的空閑時段。
我建議您瀏覽一下OpenJPA文檔,了解如何處理大型結果集 。
我建議你下載VisualVM並為所涉及的軟件包設置一個分析。 VisualVM可以顯示在不同方法中花費的時間,理論上可以總計達到0.35秒。 您將能夠分析代碼,OpenJPA和網絡IO之間的總時間分布。 這將幫助您識別瓶頸。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.