【问题标题】:How to store data in MySql through multiple threads?如何通过多线程在MySql中存储数据?
【发布时间】:2009-09-26 19:41:52
【问题描述】:

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

我写了三个函数如下:

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

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

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

我该怎么做?

如果您需要,我可以提供更多信息。

【问题讨论】:

    标签: java mysql multithreading


    【解决方案1】:

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

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

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

    【讨论】:

    • 连接实际上线程安全的,如 JDBC 规范所要求的。事实上,您在回答stackoverflow.com/questions/1209693/… 时自己也是这么说的。也就是说,对多个线程使用相同的连接 是个坏主意,除非绝对有必要在单个事务中执行所有工作。在所有其他情况下,连接池绝对是要走的路。 +1
    • ChssPly76,感谢您的更正。确实是一个可怕的错误。
    【解决方案2】:

    你能不能让 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 很有帮助。

    【讨论】:

      【解决方案3】:

      使用 MySQL,多个线程不能共享连接。你应该试试看会发生什么。你会从服务器收到很多状态错误。

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-12-13
        • 2018-05-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-28
        • 2015-06-04
        相关资源
        最近更新 更多