java.sql.SQLException: Could not commit with auto-commit set on

本文介绍了解决使用Oracle JDBC Driver 12及以上版本时出现的“Could not commit with auto-commit set on”异常的方法。提供了更换旧版本驱动、设置JVM参数以及关闭Auto-Commit的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

java.sql.SQLException: Could not commit with auto-commit set on 
        at oracle.jdbc.driver.PhysicalConnection.commit(PhysicalConnection.java:2356) 
        at oracle.jdbc.driver.PhysicalConnection.commit(PhysicalConnection.java:2403) 
        at com.mchange.v2.c3p0.impl.NewProxyConnection.commit(NewProxyConnection.java:803)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1153) 
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)

    at java.lang.Thread.run(Thread.java:785) 

 

解决方法:本人原来用的驱动是 ojdbc6-12.1.0.2.0.19120445.jar 报上面错误,换成ojdbc5_g.jar 即可解决上面问题

思路来自:

 

This kind of exceptions occur when the Oracle JDBC Driver (ojdbc6.jar) version 12 or above will be used. Version 12 and above of the driver is more strictly than earlier driver versions.

You can solve the problem, you have few options:

  1. Change jar file to old version.( Below 12; usually issue occurs while migrating to new server)
  2. Override behavior of new jar version(ojdbc6.jar) with setting below JVM arguments.

    -Doracle.jdbc.autoCommitSpecCompliant=false

    IBM WAS users, refer this link:

  3. Set Auto Commit off in Java/SQL:

    Java:

    conn.setAutoCommit(false);

    Oracle:

    SET AUTOCOMMIT OFF

 


https://stackoverflow.com/questions/23953534/java-sql-sqlexception-could-not-commit-with-auto-commit-set-on-at-oracle-jdbc-d

 

 

### 解决JDBC连接事务时无法打开连接的问题 当遇到无法打开 JDBC 连接进行事务操作的情况,通常是因为以下几个原因: - **缺少或错误配置的驱动程序**:确保已加载正确的数据库驱动程序[^2]。每个数据库供应商提供特定于其产品的驱动程序,这些驱动程序对于建立到相应数据库的连接至关重要。 - **不正确的 URL、用户名或密码**:验证用于创建 `Connection` 的字符串是否准确无误[^3]。任何拼写上的失误都会导致连接失败。 - **网络问题或其他外部因素**:确认应用程序能够访问目标数据库服务器,并且不存在防火墙规则阻止通信路径。 针对上述情况的具体解决方案如下所示: #### 验证并加载合适的驱动器 为了使 Java 应用可以与 MySQL 数据库交互,在项目启动初期应当通过 Class.forName 方法显式注册相应的驱动类名称(例如:"com.mysql.cj.jdbc.Driver"),尽管现代版本的 JDBC 可能不再严格要求此步骤,但仍建议这样做以增强兼容性和可读性。 ```java try { Class.forName("com.mysql.c.j.jdbc.Driver"); } catch (ClassNotFoundException e) { System.out.println("找不到MySQL驱动!"); } ``` #### 正确设置连接属性 构建 DataSource 或直接利用 DriverManager 获取 Connection 实例前,请仔细核对所提供的参数值是否匹配实际环境下的设定。这里给出一段基于 Properties 对象封装登录凭证及其他必要选项的例子: ```properties String url = "jdbc:mysql://localhost:3306/testdb"; Properties props = new Properties(); props.setProperty("user", "root"); // 用户名 props.setProperty("password", "your_password_here!"); // 密码 // 添加其他可能需要调整的属性... ``` 随后可以通过下面的方式获得一个可用的 Connection 对象实例: ```java Connection conn; try{ conn = DriverManager.getConnection(url, props); }catch(SQLException ex){ Logger.getLogger(DBHelper.class.getName()).log(Level.SEVERE,null,ex); } if(conn != null && !conn.isClosed()){ try { conn.setAutoCommit(false); // 开启事务模式 }catch(Exception e){ DbUtils.closeQuietly(conn); throw new RuntimeException(e.getMessage()); } }else{ throw new SQLException("未能成功建立至数据库的有效链接."); } ``` 这段代码不仅实现了基本的功能需求,还加入了必要的异常处理逻辑以及日志记录机制以便后续排查潜在隐患。 #### 处理可能出现的异常状况 考虑到现实环境中不可避免会遭遇各种意外情形,因此编写健壮的应用程序时务必将所有可能发生的风险纳入考量范围之内。比如在网络不稳定的情况下尝试重连;或是捕获因权限不足等原因引发的安全相关报错信息并向用户反馈清晰易懂的消息提示等等。 最后值得注意的是,一旦完成了所有的 SQL 操作之后记得及时释放资源,即调用 commit 和 close 方法结束当前事务周期,防止长时间占用不必要的系统开销。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值