JDBC批量执行sql .

本文探讨了JDBC中批量处理语句在SQL执行中的应用,包括多条SQL语句的批量处理与单条语句的批量参数传递,通过对比传统方法与批量处理方法的效率差异,强调了批量处理语句在提高执行效率方面的优势。

声明: 非原创,原帖地址http://blog.sina.com.cn/s/blog_4d8a2c970100g59y.html

 

JDBC的批量处理语句包括下面两个方法:
addBatch(String):添加需要批量处理的SQL语句或是参数;
executeBatch();执行批量处理语句;

通常我们会遇到两种批量执行SQL语句的情况:

1 多条SQL语句的批量处理;
2 一个SQL语句的批量传参;

第一种情况:
针对第一种情况我们以前的做法可能是创建多个Statement,然后挨个execute,或者干脆写个PL/SQL;写过程是个明智的做法,但是我们还可以利用JDBC的批量处理语句进行处理,如下:
 ...
 Statement st = conn.createStatement();
 st.addBatch(sql1);
 st.addBatch(sql2);
 ...
 st.addBatch(sqln);
 st.executeBatch();
 ...


我们只创建一次Statement,然后addBatch多条SQL,最后一起执行就可以了,这种用法不多,感觉还不如写个PL/SQL!

 

第二种情况:
但是第二种情况利用JDBC的批量处理语句就比较常见了,这一般用于PreparedStatement,执行同一条语句,只是要传多条参数,多用于批量增、删、改!以前我们习惯使用下面循环的方式进行传参。
 ...
 PreparedStatement pst = conn.prepareStatement(sql);
 for(int i=0;i<N;i++)...{
  pst.setInt(1,i);
  ....
  pst.executeQuery();
 }
 ...


如果我们使用了JDBC的批量处理语句,就可以像下面那样处理:
 ...
 PreparedStatement pst = conn.prepareStatement(sql);
 for(int i=100;i<1101;i++)...{
  pst.setInt(1,i);
  ...
  pst.addBatch();
 }
 pst.executeBatch();
 ...


前者是每传一次参就要执行一次,而后者只执行一次!我做了一个测试,在批量处理的条数很少的时候二者的效率差别不是很大,但是超过50条,就有了差距,随着条数的增多就越明显!所以当我们遇到批量处理的时候,一定要优先考虑JDBC的批量处理语句。

注意:
1 第一种情况不可以添加查询SQL,因为executeBatch()返回的是int [],如果把返回ResultSet的SQl加入会引起异常;
2 第二种情况可以适用于没有返回参数的存储过程,如果存储过程有返回参数,是不可以使用批量处理的!

### 使用 JDBC 批量执行 UPDATE SQL 的正确方法及注意事项 在使用 JDBC 批量执行 `UPDATE` 语句时,如果未正确配置或使用不当,JDBC 驱动会将批量 SQL 拆分成多条语句依次执行,而不是以真正的批量方式提交,这将导致性能下降[^1]。因此,需要遵循一定的编码规范并调整数据库连接参数,以确保批量更新能够高效执行。 #### 正确使用 JDBC 批量执行 UPDATE 的方式 为了实现真正的批量执行,需要使用 `PreparedStatement` 的 `addBatch()` 和 `executeBatch()` 方法,并确保数据库连接 URL 中包含 `rewriteBatchedStatements=true` 参数。这种方式可以显著减少数据库往返次数,从而提升执行效率。 以下是一个示例代码: ```java String url = "jdbc:mysql://localhost:3306/test?rewriteBatchedStatements=true"; try (Connection conn = DriverManager.getConnection(url, "user", "password"); PreparedStatement pstmt = conn.prepareStatement("UPDATE users SET name = ? WHERE id = ?")) { conn.setAutoCommit(false); // 开启事务 for (int i = 0; i < 1000; i++) { pstmt.setString(1, "Name" + i); pstmt.setInt(2, i + 1); pstmt.addBatch(); // 添加到批处理 } pstmt.executeBatch(); // 执行批处理 conn.commit(); // 提交事务 } catch (SQLException e) { e.printStackTrace(); } ``` 该方式可以有效减少网络往返次数,提高批量更新的执行效率。 #### 注意事项 1. **批量大小限制**:即使启用了 `rewriteBatchedStatements=true`,如果批量 SQL 的数量小于 2,驱动仍然会拆分执行。因此,在实际使用中应确保每次批量操作至少包含两条以上的 SQL 语句。 2. **事务控制**:在执行批量更新时,建议手动开启事务(`setAutoCommit(false)`),并在执行完成后提交事务(`commit()`),以确保数据一致性[^1]。 3. **资源管理**:使用 try-with-resources 可以自动关闭 `Connection`、`PreparedStatement` 和 `ResultSet` 等资源,避免资源泄漏。 4. **性能与内存平衡**:虽然批量执行可以减少数据库访问次数,但过大的批量可能导致内存占用过高。应根据实际数据量和系统资源合理控制每次批量更新的条目数[^2]。 5. **驱动兼容性**:不同数据库厂商的 JDBC 驱动对批量操作的支持方式不同。例如,MySQL 需要通过 `rewriteBatchedStatements=true` 启用批量优化,而 Oracle 和 PostgreSQL 的处理方式则可能不同,需查阅相应驱动文档。 #### 与其他框架的对比 在 MyBatis 中,批量更新的实现方式与 JDBC 类似,但需要手动控制 `SqlSession` 的批处理模式。如果不使用批处理模式,MyBatis 也会将每条更新语句单独提交,导致性能下降。此外,如果使用 Hibernate,批量更新需要先加载所有实体对象到内存中,再逐个更新,这种方式会占用大量内存并频繁访问数据库,影响性能。 #### 总结 JDBC 批量执行 `UPDATE` 语句是一种提升数据库操作效率的有效手段,但必须结合正确的编码方式和数据库连接参数配置才能发挥其优势。合理控制批量大小、开启事务管理、使用 try-with-resources 以及关注驱动兼容性是实现高效批量更新的关键。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值