根據我上面的問題,我需要在我的數據庫的一個表中插入超過20000行。根據表現,我正在尋找一種方法來提高這一過程的效率。我的第一個想法是用Java.Thread實現這一點,但我不太確定這是否足夠節省。有沒有人對我有好的建議?使用Java.Thread將數據插入MySQL數據庫是否安全?
編輯:我已經使用preparedStatement.addBatch()
根據我上面的問題,我需要在我的數據庫的一個表中插入超過20000行。根據表現,我正在尋找一種方法來提高這一過程的效率。我的第一個想法是用Java.Thread實現這一點,但我不太確定這是否足夠節省。有沒有人對我有好的建議?使用Java.Thread將數據插入MySQL數據庫是否安全?
編輯:我已經使用preparedStatement.addBatch()
看起來安全對我來說,只要每個線程使用不同的連接對象,然後適當的資源的處置。
無論如何,請注意數據庫本身對同時運行的請求(MySQL中的max_connections)有限制,所以它不會幫助創建比此數字更多的線程。另外,請考慮其他優化,例如batch inserts。
從不同線程訪問數據庫沒有任何問題。正如Eyal所寫,只要確保像Connections這樣的東西只能用於單個線程並妥善處置。
另一個問題是,如果這實際上會幫助你的表現。在使用多個線程之前,我會確保你做了所有其他的事情。特別是使用批處理語句似乎是第一個選項,如果你還沒有。
我正在對批處理和線程的組合進行基準測試。是否有可能將整批(例如2000行)推入數據庫,或者是否已經通過調用'preparedStatement.executeBatch()'完成了這一操作?對於〜8000行的一個大批次,爲 – commandcraxx 2013-02-27 10:01:37
〜10分鐘。 〜10分鐘,10個螺紋和10個小批量。我認爲這應該可以提高性能。 – commandcraxx 2013-02-27 10:08:45
我看到的問題是同步線程。所以我得到了不一致的數據插入,如果我使用多個線程... – commandcraxx 2013-02-27 11:07:54
如果我理解正確,您需要一種方法將數千個查詢寫入您的數據庫。 你知道你可以執行一批MySQL查詢嗎? 有關於這已經#2問題, Java: Insert multiple rows into MySQL with PreparedStatement
你可以使用:)) http://docs.oracle.com/javase/6/docs/api/java/sql/Statement.html#executeBatch%28%29
退房@BalusC的PreparedStatement的#addBatch(http://docs.oracle.com/javase/6/docs/api/java/sql/PreparedStatement.html#addBatch%28%29
和 的PreparedStatement#則ExecuteBatch(在上面的鏈接中回答更多的細節。
看到我下面的評論。是的,我已經使用批處理。對不起,我忘了寫下我的問題。 – commandcraxx 2013-02-27 10:09:49
「20000000」聽起來不像(以數據庫維度)開頭。
在通過多線程增加複雜性之前,最好先探討預處理語句和批處理語句的可能性。
這取決於您的特定類型的數據庫,但大多數RDBMS具有允許執行此類任務的批量加載程序。
如果您想添加一些信息(數據庫類型,記錄長度,數據庫是否與應用程序在單獨的計算機上運行,並且它是否具有足夠的處理能力來處理多個高壓線程,而不會嚴重拖延這個原因)人們可能會更好地幫助。
我不關於多線程,但你可以檢查了這一點:http://stackoverflow.com/questions/7195665/java-jdbc-multiple-prepared-statement-bulk-insert – Aashray 2013-02-27 09:14:00
你可以使用存儲過程和調用它來自你的java代碼。 – Biswajit 2013-02-27 09:17:28