2011-09-19 47 views
2

我目前有一個Java線程每隔幾秒更新一次數據庫。數據庫是MSSQL 2005,Java版本是6.0。如何提高Java的數據庫更新性能?

每次大概有800個更新。所以我做了setAutoCommit(false)在biginning和電話調用後。這些需要大約500ms。

我也嘗試使用批處理模式,並且改進是微不足道的。現在大約需要250毫秒。

有什麼辦法可以改善嗎? 250ms仍然顯得太慢。

服務器和客戶端位於同一個數據中心,延遲應該是最小的。

+4

Marginal?它** **兩次**一樣快!數據有多大?這段時間是否考慮到連接時間和網絡延遲? – BalusC

+4

對於800更新,250ms聽起來不算太糟糕。 – Qwerky

+0

您是否使用任何連接池實現,或直接從'DriverManager'?如果沒有,您可以嘗試http://proxool.sourceforge.net/或http://jolbox.com/或http://sourceforge.net/projects/c3p0/ –

回答

4

你沒有解釋你想要做什麼,所以很難提出改進建議。

您可能會嘗試的一件事是重構您的dbms模式,以便您可以INSERT而不是每隔幾秒更新一次這些行。這應該有所幫助。您可能可以使用小時或隔夜刪除操作來清除舊數據。

另一件事可能是弄清楚如何構造數據,以便處理少於800行的數據。你可以把多個數據項放在一個單獨的行中。這會讓你更新更少的行。

不得不說,一秒鐘內800次更新並不是可怕的表現。

+1

++在這一點上是正確的。也..你有沒有不必要的索引?您是使用直接SQL還是使用PreparedStatements?數據庫中是否需要更大的緩衝池或頁面大小?如果沒有解釋你在做什麼,以及爲什麼奧利瓊斯提到過,那就太難說了。此外,您可能想查看DBA網站(dba.stackexchange.com)。我從那些最瞭解數據庫的人那裏得到了一些非常有用的答案 - DBA。 –

+0

更新聲明如此昂貴?我不知道...做800行的插入應該快得多嗎? – Johnyy

+0

更新語句必須讀取,修改和寫入表,並可能更新索引。它必須具備某種交易完整性。插入不需要讀取或修改,但他們確實需要其餘部分。 dbms可以推遲插入的一些工作。如果你只是做了其中的一些,這不會是一個大問題。但是你做了很多。 –