Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中通过JDBC使用MySQL的自动提交语句的最佳实践_Java_Mysql_Jdbc - Fatal编程技术网

Java中通过JDBC使用MySQL的自动提交语句的最佳实践

Java中通过JDBC使用MySQL的自动提交语句的最佳实践,java,mysql,jdbc,Java,Mysql,Jdbc,在Java代码中,我通过JDBC连接与MySQL数据库交互。我设置了一个连接和一些语句(供重用) 对于大多数代码,statement.executeQuery(查询)是可以的,但有些操作是“块”,所以我需要确保它们要么一起执行,要么都不执行。我相信下面的代码实现了这一点 connect.setAutoCommit(false); statement.addBatch(insertquery1); statement.addB

在Java代码中,我通过JDBC连接与MySQL数据库交互。我设置了一个连接和一些语句(供重用)

对于大多数代码,statement.executeQuery(查询)是可以的,但有些操作是“块”,所以我需要确保它们要么一起执行,要么都不执行。我相信下面的代码实现了这一点

            connect.setAutoCommit(false);
            statement.addBatch(insertquery1);
            statement.addBatch(insertquery2);
            statement.addBatch(insertquery3);
            statement.addBatch(insertquery4);
            statement.executeBatch();
            connect.commit();           
            connect.setAutoCommit(true);
据我所知,connect调用会影响整个连接,因此会影响语句和语句2。此外,我似乎可以在创建语句对象后设置自动提交值,并且该值仍然适用于它。这是正确的吗?对于下面这样的自动提交调用,拆分它们并保留一个不同的连接对象是否更好/更有效

            // objects purely for batch operations
            connect = DriverManager.getConnection(connectionstring);            
            connect.setAutoCommit(false);
            statement = connect.createStatement();
            // objects for normal operations
            connect2 = DriverManager.getConnection(connectionstring);           
            connect2.setAutoCommit(true);
            statement2 = connect2.createStatement();

在我的应用程序中,它们只占调用的不到1%,但这一百分比确实需要成批完成。最佳实践是什么?

将auto commit设置为false的全部目的是使多个SQL语句都可以在同一事务中运行。而且,如果您的4条insert语句中的任何一条出现错误,整个事务都将在逻辑上回滚,这样您就不会在数据库中得到不一致的数据。您已经遵循的模式是最佳实践:

connect.setAutoCommit(false);
statement.addBatch(insertquery1);
statement.addBatch(insertquery2);
statement.addBatch(insertquery3);
statement.addBatch(insertquery4);
statement.executeBatch();
connect.commit();           
connect.setAutoCommit(true);

也就是说,在完成事务后将自动提交返回为true是最佳实践。这样,如果其他人继承了您的代码的任何其他部分,或者您未来的代码,并且仍然使用相同的连接对象,则会收到自动提交的默认行为。

谢谢。问题是我是否应该将自动提交和普通查询划分为不同的连接,例如出于性能原因?实际上,如果您真正关心性能,那么应该考虑使用连接池,而不是原始JDBC接口。当您在这里进行连接时,从零开始建立连接需要很大的开销。也就是说,如果您不能使用连接池,那么您应该避免为多个查询创建新连接,即对自动提交和非自动提交使用相同的连接。这就是我目前正在做的,我集中创建了一个连接对象,并派生出少量语句对象,然后通过其他地方的代码重用这些对象。我个人更喜欢这种连接池,因为我可以手动管理语句(重新)使用。连接对象只创建一次,最多可使用6个小时,因此一开始只需少量成本就可以了。因此,问题的另一部分的一般答案是避免创建新连接,因为这可能非常昂贵。如果您需要执行,例如,关闭自动提交时执行1个事务,打开自动提交时执行1个事务,如果可能,尝试使用相同的连接不做任何事情,只设置将导致
开始的标志在执行下一条语句开始事务时发出。尽管这取决于司机。但是
setAutocommit(true)在事务中时。
connect.setAutoCommit(false);
statement.addBatch(insertquery1);
statement.addBatch(insertquery2);
statement.addBatch(insertquery3);
statement.addBatch(insertquery4);
statement.executeBatch();
connect.commit();           
connect.setAutoCommit(true);