爲了改變這個問題:我應該避免在不同線程之間共享實現java.sql.Connection
的類的實例嗎?是java.sql.Connection線程安全嗎?
回答
如果JDBC驅動程序規範兼容的,那麼在技術上是,對象是線程安全的,但是你應該避免線程之間共享連接,因爲連接上的活動將意味着只有一個線程就能做到一次一切。
您應該使用連接池(如Apache Commons DBCP),以確保每個線程都有自己的連接。
java.sql.Connection中是一個接口。所以,這一切都取決於驅動程序的實現,但通常應避免在不同線程之間共享相同的連接並使用連接池。此外,還建議池中的連接數量高於工作線程數量。
接口是一個契約,契約*可以*指定所有的實現必須是線程安全的。這只是對於java.sql.Connection而言不是這種情況。 –
是的,接口是一個契約,你可以在描述契約的文檔中加入一些額外的需求,但正如你所說的那樣,java.sql.Connection文檔沒有定義線程安全需求,即使它定義了這個需求,安全不是可以嚴格描述和執行的東西。實施可能仍然違反合同(有時候是錯誤的,有時候通過設計例如IdentityHashMap)。 –
@AndreyAdamovich:「建議池中的連接數量高於工作線程的數量」爲什麼?我的意思是,如果我在連接池中有很多連接,我將最終遇到Thrashing問題。 –
我們有ArrayOutOfBoundsException在WebSphere語句緩存的是pooleddatasource,我們不得不禁用緩存。
我們有這樣的擋住自己治療。
所有這一切,因爲當前訪問的連接,所以得出的結論通過現實生活中的實踐,是你必須這樣做。
這是相當一個古老的線程,但對於那些誰是尋找有關Microsoft SQL Server的一個答案,這裏是答案:
SQLServerConnection不是線程安全的,從一個單一的連接創建但是多個語句可以在併發線程中同時處理。
和
SQLServerConnection實現JDBC連接到SQL Server。
從以上所有,你可以共享語句,但不能連接,並且萬一你需要每個線程中的連接,你可以使用線程池。
更多here
- 1. 是CreateChildContainer()線程安全嗎?
- 2. 是Thread.getStackTrace()線程安全嗎?
- 3. 是DocumentBuilder.parse()線程安全嗎?
- 4. 是javax.sql.DataSource線程安全嗎?
- 5. 是TcpClient.Available線程安全嗎?
- 6. 是sqlite.swift線程安全嗎?
- 7. 是winsock2線程安全嗎?
- 8. 是unique_ptr線程安全嗎?
- 9. 是SplittableRandom.split()線程安全嗎?
- 10. 線程安全(是嗎?)
- 11. 是IP2Location線程安全嗎?
- 12. 是System.DirectoryServices.AccountManagement.GroupPrincipal線程安全嗎?
- 13. 是Microsoft.Practices.EnterpriseLibrary.Data.Database.SetParameterValue線程安全嗎?
- 14. 是java.util.UUID線程安全嗎?
- 15. 是enumerateUsingBlock:線程安全嗎?
- 16. 是java.util.concurrent.Future線程安全嗎?
- 17. 是DatagramSocket.send線程安全嗎?
- 18. 是長線程安全嗎?
- 19. 是SpelExpression線程安全嗎?
- 20. 是UImage.AsPNG()線程安全嗎?
- 21. 是ArrayDescriptor線程安全嗎?
- 22. java線程安全:線程安全嗎?
- 23. 是getResourceAsStream()是線程安全的嗎?
- 24. libgcrypt是線程安全的嗎?
- 25. XMLInputFactory是線程安全的嗎?
- 26. EF對象是線程安全的嗎?
- 27. python zipfile是線程安全的嗎?
- 28. ClassLoader應該是線程安全的嗎?
- 29. 是boost :: detail :: atomic_count線程安全嗎?
- 30. XOM:是Builder.build()線程安全嗎?
例如Postgres的的實現訪問,所以它不是線程安全的不同步,以自動提交標誌。 –
我頭腦裏的聲音告訴我JDBC規範要求所有的java.sql對象都是線程安全的,但是我找不到對它的引用。 – skaffman
你的聲音可能會引用http://java.sun.com/j2se/1.3/docs/guide/jdbc/spec/jdbc-spec.frame9.html它說「我們需要對所有的java.sql進行所有操作對象是多線程安全的,並且能夠正確處理多個線程同時調用同一個對象。「 – janko