2012-09-05 64 views
2

我最近需要創建一個批處理,該批處理讀取具有數百萬行的表格。該表有大約12列,我只需要做一個read操作。但是我需要所有的領域,所以我想到了使用持久化對象的想法。與Hibernate或JDBC相比JPA批處理的性能糟糕

我真的只使用最基本的代碼來實現這一點,沒有任何調整。 JPA很煩人,因爲它迫使我使用自定義分頁maxResultsminResults。如果您有興趣,可以在下面查看大概的代碼超鏈接。真的是沒有別的話,默認XML文件等旁邊

的JPA代碼:http://codeviewer.org/view/code:297e
的Hibernate代碼:http://codeviewer.org/view/code:297f
的JDBC代碼:同上,但對最終「d」(對不起,我只能發佈2個鏈接)

完成操作的結果是類似的東西。我只是說讀操作:

JPA:   Per 5 seconds: 1.000||Per Minute: 12.000||Per Hour: 720.000 
Hibernate: Per 5 seconds: 20.000||Per Minute: 240.000||Per Hour: 14.400.000 
JDBC:  Per 5 seconds: 50.000-80.000||Per Minute: 600.000-960.000||Per Hour: 36.000.000-57.600.000 

我不能解釋它,但JPA是荒謬的。這隻能是一個很壞的笑話。有趣的是,它的啓動速度與Hibernate代碼的速度相同,但在大約30,000條記錄之後,它變得越來越慢,直到它以每5秒1.000次讀取操作穩定。它在完成大約100,000條記錄後達到了這一點。但說實話......這個速度沒有意義。

這是爲什麼?請給我解釋一下。我真的不知道我做錯了什麼。但我也認爲它不應該那麼慢,即使使用默認設置。它不可能,也不可能!相比之下,Hibernate和JDBC的速度始終是可以接受和穩定的。

+0

哪個是您的JPA提供程序? – sinuhepop

+0

提供程序是org.hibernate.ejb.HibernatePersistence – Malvin

+1

您是否嘗試過更大的頁碼大小(20非常小,因此會導致大量查詢在JPA代碼中執行),並避免沖洗EM(自這是一個只讀操作,沒有什麼需要刷新,但刷新會導致Hibernate檢查所有緩存實體的髒兮兮)。 –

回答

4

通過Hibernate,您只需使用一個查詢和可滾動結果即可獲得良好的性能。不幸的是,這在JPA中目前不可行,並且您必須對每個結果頁面執行查詢。

所以,你做得對。但是,您的頁面大小隻能設置爲20個結果。這是非常少的,所以你的代碼會產生大量的查詢。嘗試更大的尺寸,例如10000個結果和性能可能會增加。無論如何,我認爲你將無法獲得接近Hibernate的數字。

+2

就是這樣!我只是將10.000作爲pageSize來使用,它的工作速度幾乎和Hibernate批處理一樣快。我剛剛習慣了20或50頁的大小,因爲大多數教程都使用了這麼低的值。我的錯。謝謝,你救了我的一天:) – Malvin