簡體   English   中英

JDBC多線程插入是否可行?

[英]Is JDBC multi-threaded insert possible?

我正在研究一個Java項目,我需要准備一個大的(對我來說)mysql數據庫。 我必須使用Jsoup進行網頁抓取並將結果存儲到我的數據庫中。 據我估計,我將插入大約1,500,000到2,000,000條記錄。 在我的第一次試驗中,我只是使用一個循環來插入這些記錄,我需要一周的時間來插入大約1/3的所需記錄,我認為這太慢了。 是否有可能使這個過程成為多線程的,這樣我就可以將我的記錄分成3組,比如每組500,000條記錄,然后將它們插入一個數據庫(具體是一個表)?

多線程不會對你有所幫助。 您只需將爭用瓶頸從應用服務器移至數據庫即可。

相反,嘗試使用批量插入,它們通常會使這種事情的速度提高幾個數量級。 請參閱JDBC教程中的“3.4進行批處理更新”

編輯 :正如@Jon評論的那樣,您需要將網頁的提取與插入到數據庫中的方式分離,否則整個過程將以最慢的操作速度進行。 您可以有多個線程獲取網頁,這會將數據添加到隊列數據結構中,然后讓一個線程使用批量插入將隊列排入數據庫。

只需確保兩個(或多個)線程不會同時使用相同的連接,使用連接池解析該連接。 c3po和apache dbcp浮現在腦海中......

您可以將您的記錄集分成批次並執行此操作,但也許您應該考慮其他因素。

您是否正在為每個INSERT進行網絡往返? 如果是,延遲可能是真正的敵人。 嘗試批處理這些請求以減少網絡流量。

你有交易嗎? 如果是,則回滾日志的大小可能是問題。

我建議分析應用服務器和數據庫服務器以查看花費的時間。 你可以浪費很多時間來猜測根本原因。

您可以在不同的線程中插入這些記錄,前提是它們使用不同的主鍵值。

您還應該查看我認為在您的情況下有用的Spring Batch

我認為多線程approch對您的問題很有用,但您必須使用connection pool (如C3P0Tomca 7 Connetcion pool以獲得更高的性能。

另一個解決方案是使用批處理操作提供程序,如Spring-batch ,也存在用於批處理操作的其他實用程序。

另一種解決方案是使用具有輸入structure參數的PL/SQl Procedure

暫無
暫無

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

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