簡體   English   中英

提高Java中Oracle DB上WRITE操作的性能

[英]Improving performance for WRITE operation on Oracle DB in Java

我有一個典型的場景,需要了解最好的解決方法,所以就這樣-

我正在開發一種解決方案,該解決方案將從基於SOAP的遠程Web服務檢索數據,然后將這些數據推送到網絡上的Oracle數據庫。 此外,這將是計划任務,每15分鍾執行一次。

我在遠程服務上擁有事件隊列,該事件隊列包含自上次檢索以來已執行的INSERT / UPDATE / DELETE操作,並且一旦檢索了最近15分鍾的事件,它將再次添加事件以進行下一次檢索。

現在,它只是將數據推送到Oracle,因此我所有的交互都是INSERT&UPDATE語句。

Oracle上大約有60個表,其中一些表有100多個列。 此外,每15分鍾循環大約會有60-70次插入,100 +次更新和10-20次刪除。

這將是一個可執行的jar文件,該文件將在操作后終止,並在下一個15分鍾的周期內再次啟動。

因此,我需要了解如何處理WRITE操作(最佳實踐)以提高整個應用程序的性能?

當前的測試代碼(每個周期)-

  • 連接到遠程服務以獲取事件。
  • 與DB創建連接(單個連接對象)。
  • 標識操作的類型(INSERT / UPDATE / DELETE)和完成操作的表。
  • 之后,根據操作和表的類型調用相應的方法。
  • 將Preparedstatement與位置參數一起使用,並從遠程服務檢索每個列值,並將其分配給語句參數。
  • 提交語句並返回以獲取事件類以處理下一個事件。
  • 重復上述過程,直到處理完所有檢索到的事件,然后程序關閉並在下一個周期開始,一切再次重復。

感謝幫助 !

如果您一次要插入或更新一行,則可以考慮執行批處理插入或批處理更新。 已經證明,如果嘗試在一定數量后更新或插入行,則會獲得更好的性能。

您正在談論的數據庫操作數(每15分鍾200個)很小,並且很容易在不到15分鍾的時間內完成。 一些具體建議:

您應該分析應用程序,以了解它在哪里花費時間。 如果您不這樣做,那么您將不知道下一步該如何優化,也不知道您所做的某些事情是否對您有所幫助或傷害。

如果可能的話,請嘗試一次將所有事件帶到遠程服務器。

您應該重用與遠程服務的連接(可能是通過使用支持連接持久性和重用的庫)。

您應該通過使用連接池庫來重用數據庫連接,而不是為每個插入/更新/刪除創建新的連接。 信不信由你,建立連接可能需要花費100倍以上的時間,只要擁有連接就可以進行數據庫操作。

您應該考慮在同一事務中執行多個(或全部)數據庫操作,而不是為每條更改的行創建一個新事務。 但是,您應該仔細考慮自己的故障模式,以免丟失任何事件(如果這是一個重要的考慮因素)。

您應該考慮利用准備好的語句緩存。 這可能會有所幫助,但如果正確配置了Oracle,則可能沒有幫助。

您應該考慮嘗試分析您的操作以查找可以一起批處理的任何操作。 如果您有一些經常執行的“熱”操作,則速度會更快。

“我有一個典型的場景”

不,你沒有。 您有一個定制的體系結構,具有唯一的數據模型,唯一的數據和獨特的業務需求。 這不是一件壞事,這是幾乎每個不是現成購買的計算機系統(甚至其中的一些)的狀態。

因此,這是一個實驗,您必須照此進行。 沒有“最佳實踐”。 嘗試各種方法,看看最有效的方法。

“需要了解處理此問題的最佳方法”

通過雇用了解Oracle數據庫的人員,您將極大地提高成功的機會。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM