2009-09-26 22 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

相关问题