在我的Java代码中,我通过JDBC连接与MySQL数据库进行交互。我建立了一个连接和一些语句(用于重用)
connect = DriverManager.getConnection(connectionstring);
statement = connect.createStatement();
statement2 = connect.createStatement();
对于大多数代码,statement.executeQuery(query)很好,但是某些操作是“块”,因此,我需要确保它们要么全部一起通过,要么全部都不通过。我相信以下代码可以实现这一目标。
connect.setAutoCommit(false);
statement.addBatch(insertquery1);
statement.addBatch(insertquery2);
statement.addBatch(insertquery3);
statement.addBatch(insertquery4);
statement.executeBatch();
connect.commit();
connect.setAutoCommit(true);
据我所知,连接调用会影响整个连接,因此会同时影响statement和statement2。另外,我似乎可以设置AutoCommit值after我创建了语句对象,它仍然适用于该对象。它是否正确?并且,将它们拆分并保留另一个连接对象(仅用于如下所示的自动提交调用)是否是一种更好的做法/效率更高?
// 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%的呼叫,但是该百分比确实需要分批完成。什么是最佳做法?
在我的Java代码中,我通过JDBC连接与MySQL数据库进行交互。我建立了一个连接,并声明了一些语句(以供重用):connect = DriverManager.getConnection(connectionstring); ...
将自动提交设置为false的全部目的是使多个SQL语句都可以在同一事务中运行。而且,如果您的4条插入语句中的任何一条出了问题,则整个事务在逻辑上将被回滚,这样您就不会在数据库中出现不一致的数据。您已经遵循的模式是最佳实践: