2010-01-27 67 views
2

過去我們用來通過存儲過程訪問數據庫。他們被認爲是管理數據的「更好的」方式。我們將數據保存在數據庫中,任何語言/平臺都可以通過JDBC/ODBC /等訪問它。然而,近年來,基於運行時反射/基於元數據的存儲檢索機制,如Hibernate/DataNucleus已經變得流行。起初我們擔心由於涉及的額外步驟(反射很昂貴)以及他們如何在我們需要的只是一個字段時檢索不必要的數據(整個對象),他們會變得很慢。用於數據倉庫項目的存儲過程與JDO

我開始規劃一個使用J2EE的大型數據倉庫項目,但我有點不確定是要去存儲過程還是JDO/JPA等等。最近,我一直在使用Hibernate,並且很坦白地說,我不會錯過編寫CRUD存儲過程!

它本質歸結爲:

存儲過程
+可以在服務器上進行優化(雖然只是查詢)
- 有可能會超過一千存儲過程:添加,刪除,update,getById等等。

JDO
+我不會在接下來的幾個月裏寫parameters.add( 「@ firstNames」,customer.getFirstName()); ...
- 將比SP的(但大多數支持分頁)會比較慢

,你會在我的處境豐滿的是什麼。在這種情況下,我認爲這非常重要。

感謝,

約翰

回答

1

羅德約翰遜在他的 「J2EE設計ADN發展」 寫了一篇關於ORM/StoredProcedures一個非常明確的分析。他說,

存儲過程應只在一個J2EE系統中執行,將始終使用數據庫巨資,它們在數據庫中或在交換大量的數據與Java代碼是否正在實現的操作數據庫。

正如你打算實施一個數據倉庫,我認爲存儲過程方法是正確的選擇。

2

「JDO - 將慢於SP的(但大多數支持分頁)」

這種假設往往是錯誤的。 SP沒有理由特別快。我已經做了一些測量,它們不比數據庫外的代碼快。

數據倉庫的特點是隻插入負載和長時間運行的SELECT...GROUP BY...查詢。

你不寫OLTP事務處理。您不使用3NF作爲防止更新/刪除事務更新異常的方法。

由於您正在進行批量插入,所以SP肯定會比批量加載實用程序慢。批量裝載機通常是多線程的,會消耗所有可用的CPU資源。SP是數據庫的一部分,只能共享有限的數據庫資源。

由於你主要在做SELECT GROUP BY,SP在這裏也沒什麼幫助。 SELECT語句不能被包裝在過程中。

你不需要它們。他們沒有幫助。

您可以輕鬆地對批量加載和查詢進行基準測試,以證明SP沒有幫助。

0

我會建議使用元數據來生成用於加載到數據倉庫中的腳本。這使您可以從使用專門的加載工具以及可能來自存儲過程(如果您使用的是足夠古老的數據庫)中獲得性能優勢。此外,你可能最終會手工編碼至少一些SQL。將通用腳本作爲存儲過程完成後,您可以按照相同的方式安排所有這些腳本,而無需擔心在重寫某些生成的代碼以使其運行得更好時如何調用它們。對於獲取數據,如果您在J2EE中構建的是報表工具,那麼使用JDO可能會更好。雖然我對事物的報告方面並不熟悉,但我可以看到的一個好處是,允許最終用戶製作您事先沒有預料到的自定義報告會更容易(儘管您仍然必須擁有一些限制他們可以做什麼,以便他們不會在這個過程中取消數據庫)。

相關問題