2009-10-07 255 views

回答

55

如果JDBC驅動程序規範兼容的,那麼在技術上是,對象是線程安全的,但是你應該避免線程之間共享連接,因爲連接上的活動將意味着只有一個線程就能做到一次一切。

您應該使用連接池(如Apache Commons DBCP),以確保每個線程都有自己的連接。

+4

例如Postgres的的實現訪問,所以它不是線程安全的不同步,以自動提交標誌。 –

+1

我頭腦裏的聲音告訴我JDBC規範要求所有的java.sql對象都是線程安全的,但是我找不到對它的引用。 – skaffman

+11

你的聲音可能會引用http://java.sun.com/j2se/1.3/docs/guide/jdbc/spec/jdbc-spec.frame9.html它說「我們需要對所有的java.sql進行所有操作對象是多線程安全的,並且能夠正確處理多個線程同時調用同一個對象。「 – janko

9

java.sql.Connection中是一個接口。所以,這一切都取決於驅動程序的實現,但通常應避免在不同線程之間共享相同的連接並使用連接池。此外,還建議池中的連接數量高於工作線程數量。

+7

接口是一個契約,契約*可以*指定所有的實現必須是線程安全的。這只是對於java.sql.Connection而言不是這種情況。 –

+1

是的,接口是一個契約,你可以在描述契約的文檔中加入一些額外的需求,但正如你所說的那樣,java.sql.Connection文檔沒有定義線程安全需求,即使它定義了這個需求,安全不是可以嚴格描述和執行的東西。實施可能仍然違反合同(有時候是錯誤的,有時候通過設計例如IdentityHashMap)。 –

+0

@AndreyAdamovich:「建議池中的連接數量高於工作線程的數量」爲什麼?我的意思是,如果我在連接池中有很多連接,我將最終遇到Thrashing問題。 –

0

我們有ArrayOutOfBoundsException在WebSphere語句緩存的是pooleddatasource,我們不得不禁用緩存。

我們有這樣的擋住自己治療。

所有這一切,因爲當前訪問的連接,所以得出的結論通過現實生活中的實踐,是你必須這樣做。

1

這是相當一個古老的線程,但對於那些誰是尋找有關Microsoft SQL Server的一個答案,這裏是答案:

SQLServerConnection不是線程安全的,從一個單一的連接創建但是多個語句可以在併發線程中同時處理。

SQLServerConnection實現JDBC連接到SQL Server。

從以上所有,你可以共享語句,但不能連接,並且萬一你需要每個線程中的連接,你可以使用線程池。

更多here