2009-07-30 45 views
13

標準的MySQL JDBC驅動程序是線程安全的嗎?具體而言,我想跨所有線程使用單個連接,但每個語句只能在單個線程中使用。有某些情況是安全的,而其他情況不是?你在這裏有什麼經驗?MySQL Connector/JDBC線程安全嗎?

+3

「..雖然你可以在線程之間共享連接(尤其是如果每個線程都有自己的Statement),但這通常不是一個好主意.Java API並不是真正用於線程安全的方式,並且大多數JDBC連接(包括MySQL的)一次只能處理一個查詢。「http://forums.mysql.com/read.php?39,171022,171195#msg-171195 – Tim 2009-07-30 22:19:43

+1

@Tim,是的,我之前看過這篇文章。儘管如此,它沒有詳細討論任何可能的問題,所以我覺得聽到別人的經驗會很有趣。另外,我覺得這是一個有效的問題,屬於堆棧溢出問題數據庫。隨意發佈該鏈接作爲答案。 :) – 2009-07-30 22:23:07

+1

請考慮使用連接池。 – 2009-07-30 22:32:25

回答

8

每個連接啓動/提交事務。除非你正在做一些非常具體的事情(我不能真正想到一個例子,說實話),你最好用連接池和每個線程的連接。

4

如果autocommit = 1,那麼讓多個線程共享同一個連接是非常可行的,前提是對連接的訪問​​是同步的。如果autocommit = 0,則必須通過某種互斥體控制對連接的訪問​​,直到提交發生。

除非您的應用程序的連接數量絕對有限,否則連接池可能是更可行的選擇。

0

根據我最近的經驗,Connection對象在Connector/J 5.1.33中不是線程安全的。

我遇到了bug 67760中描述的死鎖情況。不知道是否是一個錯誤,但在討論一個合理的建議是:

[2012年12月12日20點33分]託德農民

,請不要使用多個線程 一個連接對象而不適當的同步。連接器/ J - 更重要的是, MySQL客戶端 - 服務器協議 - 不允許同時使用相同連接對象的 操作。如果必須跨線程共享Connection對象 ,則應用程序代碼作者應負責確保操作正確序列化。