如何通过多个线程在MySql中存储数据?

时间:2009-09-26 19:41:53

标签: java mysql multithreading

我已经从main()函数启动了五个线程。

我写了三个函数如下:

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

现在我希望main函数在通过调用getConnectionToDataBase()启动这五个线程之前建立与数据库的连接,这样每个线程都不必启动新连接。

现在我希望每个线程都应该通过首先获取main()函数建立的连接来调用saveToDataBase()来存储数据。

我该怎么做?

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

3 个答案:

答案 0 :(得分:2)

这样做是个坏主意。 (感谢ChssPly76指出我的错误和糟糕的记忆。)

但是如果必须,让主类创建连接并将其传递给实现Runnable的每个类的构造函数。执行数据库工作的类将具有引用Connection的私有数据成员。然后主类在完成后关闭Connection。

更好的设计是每个线程连接一个连接池,但它是您的选择。

答案 1 :(得分: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 :(得分:0)

使用MySQL,多个线程无法共享连接。你应该试试看看会发生什么。您将从服务器获得许多状态错误。

MySQL有一个同步协议,每个连接(物理TCP连接)一次只能做一件事。在发送下一个查询之前,您必须等待一个事务完成。使用MySQL的JDBC驱动程序,一个JDBC连接映射到一个物理连接。

如果您控制线程,则可以使用每线程连接。线程启动时打开连接,线程停止时关闭。

如果您无法控制线程创建,则需要使用某种池化机制。您可以查看DBCPC3P0