jdbc批处理

有的时候,我们需要一次性插入很多的数据或者一次性更新、删除很多的数据,那么为了提高效率,我们不妨使用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压力,对维持高系能的应用有极大的帮助。

时间: 2024-10-29 19:10:57

jdbc批处理的相关文章

Java JDBC批处理插入数据操作

在此笔记里,我们将看到我们如何可以使用像Statement和PreparedStatement JDBC API来批量在任何数据库中插入数据.此外,我们将努力探索一些场景,如在内存不足时正常运行,以及如何优化批量操作. 首先,使用Java JDBC基本的API批量插入数据到数据库中. Simple Batch - 简单批处理    我把它叫做简单批处理.要求很简单,执行批量插入列表,而不是为每个INSERT语句每次提交数据库,我们将使用JDBC批处理操作和优化性能. 想想一下下面的代码: Bad

JDBC批处理Select语句

注:为了更好理解本文,请结合原文阅读 在上一篇文章中提到了PreparedStatement的局限性:PreparedStatement不允许一个占位符(?)设置多个值,本文试图从其它角度来解决该问题. 在网络上开销最昂贵的资源就是客户端与服务器往返的请求与响应,JDBC中类似的一种情况就是对数据库的调用,如果你在做数据插入.更新.删除操作,可以使用executeBatch()方法减少数据库调用次数,如: 1 2 3 4 5 Statement pstmt = conn.createStatem

JDBC批处理executeBatch

JDBC运行SQL声明,有两个处理接口,一PreparedStatement,Statement,一般程序JDBC有多少仍然比较PreparedStatement 只要运行批处理,PreparedStatement少一点Statement ps = conn.prepareStatement(sql); for(int i = 0;i<10;i++){ ps.setString(1,"1"); //PreparedStatement批处理方式一 ps.addBatch(); }

Java基础系列13:JDBC批处理简介

关于JDBC的批处理,这是JDBC2.0以后兴起的概念.所谓批处理就是可以一次性执行多条SQL命令,比如:插入.删除等.如果想要实现批处理操作,则需要使用PreparedStatement的addBatch()方法将一条SQL语句添加到批处理中,接着使用executeBatch()方法来执行前面添加的全部命令.示例代码如下: package javase.jdbc; import java.sql.Connection; import java.sql.PreparedStatement; im

JDBC批处理数据

JDBC提供了数据库batch处理的能力,在数据大批量操作(新增.删除等)的情况下可以大幅度提升系统的性能. // 关闭自动执行 con.setAutoCommit(false); Statement stmt = con.createStatement(); 禁用了自动执行模式,从而在调用 Statement.executeBatch() 时可以防止 JDBC 执行事务处理.禁用自动执行使得应用程序能够在发生错误及批处理中的某些命令不能执行时决定是否执行事务处理.因此,当进行批处理更新时,通常

spring jdbc 批处理插入主健重复的数据

1.有事务:当调用spring jdbc 的批处理的时候,在实现层加入事物,只要有插入异常的数据,整个批处理操作都会回滚.事务保证操作的原子性. 2.无事务:当没有事务的时候,批处理插入数据的时候,若主健重复则会直接抛出异常,后面没有主键冲突的依然不会插入,因为当抛出异常的时候,下一次插入操作就不会执行. 3.当想要插入的数据是增量的 有两种方法:第一种删除原来的数据,插入新的数据.第二种:插入数据主健重复的时候做更新操作 insert into   on dupulicate key upda

Jdbc批处理一点异同

同样的代码: public class TestBatch {   public static void main(String[] args) throws SQLException, ClassNotFoundException { //Class.forName("oracle.jdbc.driver.OracleDriver"); //Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@lo

Vertx JDBC 批处理

JDBC 批处理

主要是是 addBatch ,executeBatch ,clearBatch 三个方法. 官方示例代码: public void batchUpdate() throws SQLException { Statement stmt = null; try { this.con.setAutoCommit(false);//关闭commit stmt = this.con.createStatement();//创建statement stmt.addBatch( "INSERT INTO CO