2009-09-26 51 views
0

我已經從main()函數啓動了五個線程。如何通過多線程在MySql中存儲數據?

我已經寫了三個功能如下:

getConnectionToDatabase(); 
saveToDataBase(); 
closeConnection(); 

現在我想的是主要功能應通過調用getConnectionToDataBase(),這樣每個線程沒有啓動這五個線程之前建立與數據庫的連接開始一個新的連接。

現在我希望每個線程都應該通過首先獲取由main()函數建立的連接來調用saveToDataBase()來存儲數據。

我該怎麼做?

如果您需要,我可以提供其他信息。

回答

1

您不能讓getConnectionToDatabase返回數據庫鏈接,然後將該鏈接傳遞給saveToDataBase和closeConnection。

這樣,你只連接一次,並使用該鏈接,在那屆所有的疑問:

例如,您的網絡連接功能,可以是這樣的:

Class.forName("org.gjt.mm.mysql.Driver"); // Load the driver 
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/data", "root", ""); // Connect 

return conn; 

你再傳給返回鏈接到相應使用它的其他功能。

看看http://www.dreamincode.net/forums/showtopic32360.htm這很有幫助。

2

這樣做不好主意。 (感謝ChssPly76指出我的錯誤和內存不足)

但是,如果您必須讓主類創建連接並將其傳遞給實現Runnable的每個類的構造函數。執行數據庫工作的類將有一個引用Connection的私有數據成員。然後,主類在完成時關閉連接。

更好的設計是每個線程連接一個連接池,但這是您的選擇。

+0

根據JDBC規範的要求,連接實際上是線程安全的。事實上,你自己在回答問題時自己回答了http://stackoverflow.com/questions/1209693/is-mysql-connector-jdbc-thread-safe這就是說,對多個線程使用相同的連接_is_是一個壞主意,除非它絕對必須在一次交易中完成所有工作。在所有其他情況下,連接池肯定是要走的路。 +1 – ChssPly76 2009-09-26 20:40:46

+0

ChssPly76,感謝您的糾正。確實是一個可怕的錯誤。 – duffymo 2009-09-26 20:50:59

0

使用MySQL,多個線程不能共享連接。你應該試試看看會發生什麼。你會從服務器得到很多狀態錯誤。

MySQL有一個同步協議,每個連接(物理TCP連接)一次只能做一件事。在發送下一個查詢之前,您必須等待一個事務完成。使用MySQL的JDBC驅動程序,一個JDBC連接被映射到一個物理連接。

如果你控制線程,你可以有每線程連接。線程啓動時打開連接,線程停止時關閉。

如果你沒有控制線程創建,你需要使用某種池化機制。您可以查看DBCPC3P0

相關問題