今天用JDBC与数据库进行交互的时候,报错如下:

*********************************************************************************************
com.ibm.db2.jcc.b.SqlException: [jcc][t4][10251][10308][3.53.70] 正在连接上执行事务时,请求了 java.sql.Connection.close()。
事务仍然保持活动状态,不能关闭连接。 ERRORCODE=-4471, SQLSTATE=null
at com.ibm.db2.jcc.b.bd.a(bd.java:660)
at com.ibm.db2.jcc.b.bd.a(bd.java:60)
at com.ibm.db2.jcc.b.bd.a(bd.java:120)
at com.ibm.db2.jcc.b.jb.t(jb.java:1105)
at com.ibm.db2.jcc.b.jb.w(jb.java:1128)
at com.ibm.db2.jcc.b.jb.u(jb.java:1114)
at com.ibm.db2.jcc.b.jb.close(jb.java:1098)
at com.softtone.excution.Odb.close(Odb.java:192)
at com.softtone.excution.Odb.main(Odb.java:219)
************************************************************************************************

总结如下:

1.JDBC默认是自动提交的,对于查询可以不用修改设置

2.JDBC中对于增、删、改、查的修改操作,为保持数据的完整性,一般都是把修改操作组装成一个事务。需要在修改之前调用connection对象的setAutoCommit(false)这个方法,在调用完statement对象的executeBatch()批量修改方法后,后面需要跟一个connection对象的commit()方法。否则,在最后调用conn.close()方法关闭连接会抛出事务正在活动,不能关闭JDBC连接的异常。

注:setAutoCommit(false)放在具体的操作里面,一般是修改操作之前。查询操作就不用设置。

示例:

public class JdbcTest {
public void execute(){
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
conn = JdbcUtil.getConnection(Constants.URL, Constants.USERNAME, Constants.PASSWORD);
String sqlQuery = "select distinct ID from table a";
stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
rs = stmt.executeQuery(sqlQuery);
StringBuffer sb1 = new StringBuffer();
while(rs.next()){
sb1.append("'"+rs.getString(1)+"'");
if(!rs.isLast()){
sb1.append(",");
}
}
rs.close();
String Id = sb1.toString();
if(!"".equals(Id)){
//为保持数据的一致性,把多个对数据库的删除操作作为一个事务,禁止自动提交
conn.setAutoCommit(false);
String sqlDelete1 = "delete from table1 where ID in (" + Id +")";
stmt.addBatch(sqlDelete1);
String sqlDelete2 = "delete from table2 where ID in (" + Id +")";
stmt.addBatch(sqlDelete2);
stmt.executeBatch();
conn.commit();
}
stmt.close();
conn.close(); } catch (SQLException e) {
e.printStackTrace();
}finally{
JdbcUtil.free(rs, stmt, conn);
}
}
}

JDBC自动提交和批处理操作的更多相关文章

  1. 使用JDBC对数据库实现批处理操作

    本篇讲述如何使用JDBC对数据库实现批处理操作.很多时候单条SQL命令不能满足我们的需求,我们需要对数据库一次实现很多操作,需要发送一批SQL命令给数据库执行. 而JDBC也提供了相应的方法给我们实现 ...

  2. postgresql 关闭自动提交

    1. 简介说明             我们知道oracle中sqlplus里面执行dml语句:是需要提交commit:若错了:也可以回滚rollback: 然而在postgresql里面默认是自动提 ...

  3. JDBC【PreparedStatment、批处理、处理二进制、自动主键、调用存储过程、函数】

    1.PreparedStatement对象 PreparedStatement对象继承Statement对象,它比Statement对象更强大,使用起来更简单 Statement对象编译SQL语句时, ...

  4. JDBC 关闭数据库连接与自动提交【转】

    // Jdbc关闭数据库连接时,会隐含一个提交事务的操作 private final static String DB_DRIVER = "oracle.jdbc.driver.Oracle ...

  5. Mybatis的JDBC提交设置/关闭mysql自动提交------关于mysql自动提交引发的惨剧

    学习Mybatis时提到了JDBC方式需要自己手动提交事务,如果不加session.commit会导致数据库的数据无法正常插入(程序本身又不给你报错,还装出一副我已经插入成功的样子) SqlSessi ...

  6. Mybatis之执行insert、update和delete操作时自动提交

    单独使用Mybaits,而没有集成Spring的话,执行insert.update和delete操作是不会自动提交的,即执行语句后不会在数据库有对应的数据变化. 解决这样的方法就是打开自动提交开关,在 ...

  7. sql小技巧——关闭自动提交,防止误操作

    set IMPLICIT_TRANSACTIONS ON--关闭自动提交on 防止误操作,除非显式提交commit后,才会真正提交到数据库中,并且可以随时回滚操作.如下: set IMPLICIT_T ...

  8. .NET Core下操作Git,自动提交代码到 GitHub

    .NET Core 3.0 预览版发布已经好些时日了,博客园也已将其用于生产环境中,可见 .NET Core 日趋成熟 回归正题,你想盖大楼吗?想 GitHub 首页一片绿吗?今天拿她玩玩自动化提交代 ...

  9. # .NET Core下操作Git,自动提交代码到

    .NET Core下操作Git,自动提交代码到 转自博客园(阿星Plus) .NET Core 3.0 预览版发布已经好些时日了,博客园也已将其用于生产环境中,可见 .NET Core 日趋成熟 回归 ...

随机推荐

  1. Android 颜色渲染(一) 颜色选择器 ColorPickerDialog剖析

    版权声明:本文为博主原创文章,未经博主允许不得转载. Android 颜色选择器之ColorPickerDialog剖析 有这样一个需求,可以让用户自定义背景颜色,这就需要提供一个颜色选择器给用户. ...

  2. 怎样创建TWaver 3D的轮廓选中效果

    在一般的游戏中.物体的选中效果会是这样: TWaver 3D中,物体的默认的选中效果一般都是一个方方正正的外框.在HTML5的Mono版本号中,TWaver提供了轮廓线样式的选中效果. 通过例如以下代 ...

  3. iOS安全攻防(三):使用Reveal分析他人app

    使用Reveal分析他人app 准备工作 1)已越狱的设备,而且已安装了OpenSSH,MobileSubstrate等有用工具(Cydia源里安装) 2)本地已安装了Reveal 操作步骤 1)拷贝 ...

  4. Android内存优化之——static使用篇(使用MAT工具进行分析)

    这篇文章主要配套与Android内存优化之——static使用篇向大家介绍MAT工具的使用,我们分析的内存泄漏程序是上一篇文章中static的使用内存泄漏的比较不容易发现泄漏的第二情况和第三种情况—— ...

  5. android开发之调试技巧 分类: android 学习笔记 2015-07-18 21:30 140人阅读 评论(0) 收藏

    我们都知道,android的调试打了断点之后运行时要使用debug as->android application 但是这样的运行效率非常低,那么我们有没有快速的方法呢? 当然有. 我们打完断点 ...

  6. PHP编译错误Don't know how to define struct flock on this system, set --enable-opcache=no

    编辑 /etc/ld.so.conf 加入 /usr/local/lib 再执行 ldconfig

  7. ASP.NET html转图片

    using System.IO; using System.Drawing; using System.Threading; using System.Windows.Forms; public cl ...

  8. 学习java随笔第二篇:java开发工具——Eclipse

    java开发工具有很多这里我使用的是Eclipse. 首先我在官网上下载了Eclipse的软件包,下载地址:http://www.eclipse.org/downloads/,然后有在网上找了一个汉化 ...

  9. 游标中的static参数

    以下测试用例将演示,使用static的游标和不使用的区别: if object_id(N't_test',N'u') is not null drop table t_test go create t ...

  10. 设置tomcat启动超时,不会自动停止

    tomcat启动时如果1000ms没有起来,服务就会自动停止.设置位置如下