有的时候,我们需要一次性插入很多的数据或者一次性更新、删除很多的数据,那么为了提高效率,我们不妨使用JDBC的批处理来完成。
看下面的小例子。
package testBatch;
import java.sql.*;
public class testBatch {
public static void main(String[] args) throws SQLException {
Connection con=null;
Statement stmt=null;
try {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8";
String user = "root";
String password = "root";
con = DriverManager.getConnection(url, user, password);
/*
* 在默认情况下,JDBC驱动程序运行在"自动提交"模式下,即发送到数据库的所有命令运行在它们自己
* 的事务中。这样做虽然方便,但付出的代价是程序运行时的开销比较大。我们可以利用批处理操作减小
* 这种开销,因为在一次批处理操作中可以执行多个数据库更新操作。但批处理操作要求事务不能处于自
* 动提交模式下。为此,我们首先要禁用自动提交模式:
* con.setAutoCommit(false);
*/
con.setAutoCommit(false);
//Statement的excute()方法只能执行一条sql语句,但是使用addBath()方法将要执行的sql语句加进来,
//然后执行excuteBath()方法,可在一次方法调用中执行多条sql语句,这样可以提高执行效率。
//stmt=con.createStatement();
//stmt.addBatch("insert into test1 values(1,‘demo1‘)");
//stmt.addBatch("insert into test1 values(2,‘demo2‘)");
//stmt.addBatch("insert into test1 values(3,‘demo3‘)");
//stmt.executeBatch();
/*
* 对于PreparedStatement使用addBatch()无参的方法。 executeBatch()方法返回一个更新计数的数组,
* 每个值对应于批处理操作中的一个命令。批处理操作可能会抛出一个类型为BatchUpdateException的异常,
* 这个异常表明批处理操作中至少有一条命令失败了
*/
PreparedStatement ps=con.prepareStatement("insert into test values(?,?)");
ps.setInt(1, 1);
ps.setString(2, "demo1");
ps.addBatch();
ps.setInt(1, 2);
ps.setString(2, "demo2");
ps.addBatch();
ps.setInt(1, 3);
ps.setString(2, "demo3");
ps.addBatch();
ps.executeBatch();
System.out.println("suceess");
ps.close();
} catch (Exception e) {
e.printStackTrace();
}finally{
// stmt.close();
con.close();
}
}
}
使用批处理的优点:
1. 多个SQL语句的执行,共用一个Connection资源。在对数据库操作时,connection资源是很宝贵的,数据库的维护从某种角度来说,就是减少数据库的连接数,减轻对DB的压力。创建一个数据连接要远远比使用数据库连接消耗资源。这也正是数据库连接池存在的意义。
2. 批处理在效率上总是比逐条处理有优势,要处理的数据的记录条数越大,批处理的优势越明显。在处理大批量相同业务逻辑的DB操作可以使用批处理达到简化、高效处理。
3. 在单一时间段,提高应用与DB间的吞吐量,缩短DB响应时间。大部分应用都有DB操作,如果SQL语句操作不当会导致DB长时间处于不可用状态,或是使DB资源占用率升高,从而影响了应用,最终被DB拖垮。缩短DB的响应时间,一来可以提供应用性能,二来减轻DB压力,对维持高系能的应用有极大的帮助。