2008-11-04 71 views
18

我需要能夠在內存中的HSQL數據庫中以每5秒至少8000個對象的一致速率插入/更新對象。我在Spring/Hibernate/JPA和純JDBC之間做了一些比較性能測試。我發現使用HSQL的性能有顯着的不同。使用Spring/Hib/JPA,我可以在5秒內插入我的1.5 KB對象中的3000-4000個(具有一對多和多對多關係),而使用直接JDBC調用我可以插入10,000-12,000個相同的對象。ORM解決方案(JPA; Hibernate)與JDBC

我不明白爲什麼會有這麼大的差異。我已經調整了Spring/Hib/JPA設置,試圖在性能上接近失敗。我希望將Spring/Hib/JPA用於未來目的,可擴展性以及因爲外鍵關係(一對多和多對多)難以手工維護;但性能要求似乎指向使用純JDBC。

任何想法爲什麼會有這麼大的差異?

+2

您可能想重命名這個問題,因爲標題並不能很好地描述實際問題。 – 2009-03-09 18:57:10

+0

你會建議什麼? – systemoutprintln 2009-03-09 20:49:22

回答

15

我們在批處理模式下比較Hibernate和JDBC(Statement#executeBatch())有類似的經驗。基本上,Hibernate似乎對批量操作沒有那麼好。在我們的例子中,Hibernate的實現在我們的生產硬件上足夠快。

您可能想要做的是將數據庫調用包裝在DAO中,爲應用程序提供一致的訪問數據的方式。在方便的地方使用Hibernate來實現你的DAO,並在需要性能需求的地方使用JDBC。

+1

你也做過Hib批處理嗎?在我的測試中,Hib批處理和JDBC批處理幾乎完全相同。 – 2008-11-04 11:49:00

5

Hibernate維護對象的一級緩存以用於髒檢查以及用作工作單元和身份映射。這增加了開銷,特別是在批量型操作中。對於批量操作,您可能需要調查不保持此狀態的StatelessSessions

+1

文檔可能已移動。 http://docs.jboss.org/hibernate/core/3.3/reference/en/html/batch。html – JavaRocky 2010-08-06 01:09:25

2

所有的映射......它可以有點昂貴,所有的神祕的邏輯和所有的反思和一致性 - 檢查它必須做的。

當然,映射的關鍵不是提升性能。通常情況下,你會受到性能影響。但是,在性能方面你會失去什麼,你在開發人員的生產力,一致性,可測試性,可靠性以及更多令人垂涎的屬性中獲得很多倍以上的好處。通常情況下,當你需要額外的性能,並且你不想放棄映射時,你可以投入更多的硬件。

9

至少,您需要在Hibernate中進行批量插入:http://www.hibernate.org/hib_docs/reference/en/html/batch.html節省大量往返時間。

而正如正義所提到的,Hib的主要目標不是計算機性能,而是開發人員的表現。話雖如此,通常可以實現JDBC結果的可比較的(不相等的,但沒有那麼糟糕)。

5

從不使用一種技術解決所有問題。 根據問題決定使用何種技術。 當然jpa或hibernate比jdbc慢。 jdbc比jpa低。 另外一個db專業版的jdbc可以編寫比jpa更優化的sql。 如果你在需要速度的地方給出臨界點,jpa不是你的選擇。