簡體   English   中英

在Java中使用並發使用預准備語句

[英]Use of Prepared Statements using Concurrency in Java

我有一個應用程序,可以處理文件中的大量數據,並將這些數據放入數據庫中。 它是單線程的; 所以我創建一個數據庫連接,在該連接上創建准備好的語句,然后在處理數據時重用這些語句。 我可能會處理成千上萬個文件,並且可以反復使用相同的准備好的語句,但只能更新值。 這一直很好,但是...

到了處理文件的時間太長的地步,由於它們都是獨立的,因此我想同時處理它們。 問題在於每個文件可能使用10條准備好的語句。 因此,現在為每個文件建立一個新的數據庫連接(即使它們已合並),設置這10條准備好的語句,然后關閉它們並為每個文件關閉連接。 因此,這發生了成千上萬次,而不是以前的一次。

我實際上還沒有進行任何計時,但是我很好奇這種連接和預備語句的使用是否是最佳方法嗎? 一次又一次地准備這些准備好的陳述真的很昂貴嗎? 有一個更好的方法嗎? 我讀到您不想共享線程之間的連接,但是也許有一個我沒想到過的更好的解決方案?

如果使用連接和預備語句是最好的方法? 一次又一次地准備這些准備好的陳述真的很昂貴嗎?

當然,您可以一次又一次地重復使用連接和准備好的語句。 您不必重新創建它們,對於連接,您當然不必每次都重新連接到數據庫服務器。 您至少應該使用數據庫連接池。 同樣,您不能同時在多個線程中使用預處理語句。 而且我還認為,對於大多數數據庫連接,您不能在不同的線程中使用相同的連接。

就是說,運行一些探查器可能是有意義的,因為線程化數據庫代碼通常提供最小的速度提高,因為您通常受數據庫服務器IO而不是線程的限制。 如果您要混合查詢,插入和事務,則可能不是這樣。 如果您正在建立與數據庫的遠程連接,則可能會獲得一些並發性。

為了提高數據庫操作的速度,請考慮在進行大量事務之前禁止自動提交,或者如果可以的話,對請求進行批處理。

我建議您使用C3P0 API進行檢查http://www.mchange.com/projects/c3p0/

增強性能是連接和語句池的目的,尤其是如果您要為每個客戶端訪問獲取未池化的連接時,這是c3p0庫的主要目標。

這部分取自C3P0 Doc,有關線程和重負載:

numHelperThreads和maxAdministrativeTaskTime幫助配置數據源線程池的行為。 默認情況下,每個數據源只有三個關聯的幫助程序線程。 如果性能似乎在重負載下拖累,或者通過JMX或直接檢查PooledDataSource觀察到,“待處理任務”的數量通常大於零,請嘗試增加numHelperThreads。 對於經歷無限期掛起的任務和“ APPARENT DEADLOCK”消息的用戶,maxAdministrativeTaskTime可能有用。

另外,我建議您在(java.util.concurrent)中使用ExecutorExecutorService來緩沖線程。

外觀如下:

Executor executor = Executors.newFixedThreadPool(int numberOfThreadsNeeded);
// Executor executor =Executors.newCachedThreadPool(); // Or this one

executor.execute(runnable);
.
.
.
etc

暫無
暫無

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

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