Java MySQL JDBC驱动程序多线程并发执行命令,最好使用线程池?

Java MySQL JDBC驱动程序多线程并发执行命令,最好使用线程池?,java,mysql,multithreading,jdbc,Java,Mysql,Multithreading,Jdbc,目前,我已经创建了一系列并行运行的自动化测试(Selenium和Java);i、 e.x5测试将通过单独的线程并发运行 一些测试将与目标数据库(MySQL)交互,然后执行特定的SQL写命令;i、 e.直接通过数据库创建新用户 在并发运行测试时,似乎不是每个线程都在写入数据库,即使SQL write语句是正确的,并且通过将线程数减少到1,我也不再遇到这个问题 我的代码: public static void createDatabaseConnection() { try {

目前,我已经创建了一系列并行运行的自动化测试(Selenium和Java);i、 e.x5测试将通过单独的线程并发运行

一些测试将与目标数据库(MySQL)交互,然后执行特定的SQL写命令;i、 e.直接通过数据库创建新用户

在并发运行测试时,似乎不是每个线程都在写入数据库,即使SQL write语句是正确的,并且通过将线程数减少到1,我也不再遇到这个问题

我的代码:

public static void createDatabaseConnection() {
    try {
        Class.forName("com.mysql.cj.jdbc.Driver");
        con = DriverManager.getConnection("jdbc:mysql://" + Db_Settings.getAddress() + ":" + Db_Settings.portNumber
                    + "/" + Db_Settings.getDbEnvironment() + "?" + Db_Settings.ssl, Db_Settings.getDbUsername(), Db_Settings.getDbPassword());
    } catch (Exception e) {
        System.out.println("Exception: " + e.getStackTrace() + ", " + e.getMessage());
    }
}

public static void closeDatabaseConnection() {
    try {
        con.close();
    } catch (Exception e) {
        System.out.println("Exception: " + e.getStackTrace() + ", " + e.getMessage());
    }
}
示例命令(Combo);可由x2+单独线程同时调用:

DbManager.createDatabaseConnection();
DbManager.executeSqlUpdateStatement(Account.createAccount_Sql_Script());
DbManager.closeDatabaseConnection();

关于在通过MySQL JDBC驱动程序进行数据库连接时是否应该使用线程池或同步的任何建议?

您可以使用Hikari JDBC池库。它允许您创建多个到数据库的连接,并并行运行sql查询,而不会出现连接冲突和连接泄漏。

这种模式很可能会导致多线程环境中的连接泄漏。想象一下
DbManager.createDatabaseConnection()DbManager.closeDatabaseConnection()时再次调用了code>尚未调用,con static全局变量将被分配新实例。想象一下
DbManager.executeSqlUpdateStatement(Account.createAccount\u Sql\u Script())
也引发了一个异常。感谢您的评论@Jayr您能为我当前的实现提供任何指导/代码更改吗?另外@Jayr每个线程都有各自的DbManager.createDatabaseConnection()实例;和DbManager.closeDatabaseConnection();我确保在给定Java方法中调用逻辑时关闭连接。因此example1()-将始终创建并关闭连接。Hi@SamP是否允许重构DbManager?至少我会尝试这样做,使其模式类似于:
try(Connection con=createDatabaseConnection()){DbManager.executeSqlUpdateStatement(con,Account.createAccount_Sql_Script());}