我最近需要創建一個批處理,該批處理讀取具有數百萬行的表格。該表有大約12列,我只需要做一個read
操作。但是我需要所有的領域,所以我想到了使用持久化對象的想法。與Hibernate或JDBC相比JPA批處理的性能糟糕
我真的只使用最基本的代碼來實現這一點,沒有任何調整。 JPA
很煩人,因爲它迫使我使用自定義分頁maxResults
和minResults
。如果您有興趣,可以在下面查看大概的代碼超鏈接。真的是沒有別的話,默認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
的速度始終是可以接受和穩定的。
哪個是您的JPA提供程序? – sinuhepop
提供程序是org.hibernate.ejb.HibernatePersistence – Malvin
您是否嘗試過更大的頁碼大小(20非常小,因此會導致大量查詢在JPA代碼中執行),並避免沖洗EM(自這是一個只讀操作,沒有什麼需要刷新,但刷新會導致Hibernate檢查所有緩存實體的髒兮兮)。 –