2012-05-09 50 views
0

我剛剛打開了數據庫中的查詢日誌記錄JPA(EclipseLink),並目睹了JPA「優化」和「緩存」的恐怖。JPA查詢「優化」

例如,做一個簡單的JPA查詢這樣的:

SELECT p FROM Picklist p; 

...會導致JPA做SQL查詢數據庫萬元(每記錄一個查詢,所以SELECT * FROM選擇列表其中id = [...])。 Picklist是一個簡單的實體!

它爲什麼不做一個SELECT * FROM Picklist,並且只是在內存中執行其他任何事情(填充Persistence Context或其他)?

是否需要一些特殊的開關來告訴它做到這一點?爲什麼它是這樣工作的?

+1

爲什麼不選擇P檔從領料磷; ?無(Picklist p) –

+0

錯字錯誤,修正。 – bozo

回答

1

首先,你需要檢查JPA查詢

SELECT Picklist p FROM Picklist p; 

這應該是

SELECT p FROM Picklist p; 

其次,你要明白,你不能讓一個Select *,因爲當你做這種類型的查詢你'帶來更多的信息,只是列。第三個記住,Hibernate需要將查詢轉換爲每個數據庫,爲了提供這種功能,一些性能可能會因爲它的Sql Native而變得鬆散,因爲它每改變一個新版本,如果你需要一個非常好的性能,它的性能就會降低。使用正常Sql查詢,您完全可以使用並處理記錄

0

JPA提供了許多不同的查詢優化技術,但如果您不使用任何這些技術,則可能會導致不必要的查詢。

我假設你看到了對選擇列表關係的查詢,儘管你正在使用的確切查詢,選擇列表的映射以及SQL都有幫助。

要了解如何優化關係

看到, http://java-persistence-performance.blogspot.com/2010/08/batch-fetching-optimizing-object-graph.html

+0

因此,例如,我有一個客戶,其中有幾個字段,即Picklist實體,即customerType和industryType。現在我調用5次daoPicklist.getByName(「合作伙伴」),並且我得到一個Picklist並將它分配給一個現有的Customer實體併合並它。這個daoPicklist.getByName(...)在(代碼的不同模塊)中多次調用以檢索Picklist。但是當我查看數據庫查詢日誌時會發生什麼,每次我調用這個方法時,都會執行SQL查詢!所以根本沒有緩存。 – bozo

+0

daoPicklist.getByName(...)做了什麼?如果它不是通過Id執行查詢,那麼它將始終訪問數據庫,除非啓用查詢緩存。 – James