jdbc事务中提交几千条update,未等commit即报Connection timed out,是否会造成锁表
场景如下:
1、建立简单的jdbc连接,设autoCommit为false;
2、循环调用statement的executeUpdate,执行四千条update;
3、执行过程中,未等到commit,即在其中一条的executeUpdate处抛出如下异常:
java.sql.SQLException: Io exception: Connection timed out
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:113)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:147)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:257)
at oracle.jdbc.driver.T4CStatement.executeForRows(T4CStatement.java:985)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1192)
at oracle.jdbc.driver.OracleStatement.executeUpdateInternal(OracleStatement.java:1662)
at oracle.jdbc.driver.OracleStatement.executeUpdate(OracleStatement.java:1631)
.....
4、出异常后,紧接着调用connection的rollback,又出如下异常:
java.sql.SQLException: Closed Connection
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:113)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:147)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:209)
at oracle.jdbc.driver.PhysicalConnection.rollback(PhysicalConnection.java:1195)
....
5、关闭连接,重建连接,执行查询,查询卡死,当时应用的堆栈信息如下:
java.lang.Thread.State: RUNNABLE
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:152)
at java.net.SocketInputStream.read(SocketInputStream.java:122)
at oracle.net.ns.Packet.receive(Unknown Source)
at oracle.net.ns.DataPacket.receive(Unknown Source)
at oracle.net.ns.NetInputStream.getNextPacket(Unknown Source)
at oracle.net.ns.NetInputStream.read(Unknown Source)
at oracle.net.ns.NetInputStream.read(Unknown Source)
at oracle.net.ns.NetInputStream.read(Unknown Source)
at oracle.jdbc.driver.T4CMAREngine.unmarshalUB1(T4CMAREngine.java:1109)
at oracle.jdbc.driver.T4CMAREngine.unmarshalSB1(T4CMAREngine.java:1080)
at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:485)
at oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:210)
at oracle.jdbc.driver.T4CStatement.executeForRows(T4CStatement.java:963)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1192)
at oracle.jdbc.driver.OracleStatement.executeUpdateInternal(OracleStatement.java:1662)
at oracle.jdbc.driver.OracleStatement.executeUpdate(OracleStatement.java:1631)
- locked <0x000000061d400280> (a oracle.jdbc.driver.T4CStatement)
- locked <0x000000061d400450> (a oracle.jdbc.driver.T4CConnection)
....
6、再查看表连接信息,显示锁表。
请教:
1、jdbc遇到此类场景,应当如何进行补救措施,来避免锁表?
2、锁表发生后,oracle是否会在一定时间后自动解锁?
谢谢!
1、建立简单的jdbc连接,设autoCommit为false;
2、循环调用statement的executeUpdate,执行四千条update;
3、执行过程中,未等到commit,即在其中一条的executeUpdate处抛出如下异常:
java.sql.SQLException: Io exception: Connection timed out
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:113)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:147)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:257)
at oracle.jdbc.driver.T4CStatement.executeForRows(T4CStatement.java:985)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1192)
at oracle.jdbc.driver.OracleStatement.executeUpdateInternal(OracleStatement.java:1662)
at oracle.jdbc.driver.OracleStatement.executeUpdate(OracleStatement.java:1631)
.....
4、出异常后,紧接着调用connection的rollback,又出如下异常:
java.sql.SQLException: Closed Connection
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:113)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:147)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:209)
at oracle.jdbc.driver.PhysicalConnection.rollback(PhysicalConnection.java:1195)
....
5、关闭连接,重建连接,执行查询,查询卡死,当时应用的堆栈信息如下:
java.lang.Thread.State: RUNNABLE
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:152)
at java.net.SocketInputStream.read(SocketInputStream.java:122)
at oracle.net.ns.Packet.receive(Unknown Source)
at oracle.net.ns.DataPacket.receive(Unknown Source)
at oracle.net.ns.NetInputStream.getNextPacket(Unknown Source)
at oracle.net.ns.NetInputStream.read(Unknown Source)
at oracle.net.ns.NetInputStream.read(Unknown Source)
at oracle.net.ns.NetInputStream.read(Unknown Source)
at oracle.jdbc.driver.T4CMAREngine.unmarshalUB1(T4CMAREngine.java:1109)
at oracle.jdbc.driver.T4CMAREngine.unmarshalSB1(T4CMAREngine.java:1080)
at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:485)
at oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:210)
at oracle.jdbc.driver.T4CStatement.executeForRows(T4CStatement.java:963)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1192)
at oracle.jdbc.driver.OracleStatement.executeUpdateInternal(OracleStatement.java:1662)
at oracle.jdbc.driver.OracleStatement.executeUpdate(OracleStatement.java:1631)
- locked <0x000000061d400280> (a oracle.jdbc.driver.T4CStatement)
- locked <0x000000061d400450> (a oracle.jdbc.driver.T4CConnection)
....
6、再查看表连接信息,显示锁表。
请教:
1、jdbc遇到此类场景,应当如何进行补救措施,来避免锁表?
2、锁表发生后,oracle是否会在一定时间后自动解锁?
谢谢!
...全文
相关推荐
java调用Oracle的锁表命令
NULL 博文链接:https://xide829.iteye.com/blog/667762
JDBC事务处理、提交、回滚。.docx
JDBC事务处理、提交、回滚。
JDBC总结——事务
文章目录事务一、事务的基本介绍1、概念2、操作3、操作实例4、MySQL数据库中默认自动提交二、事务的四大特征三、事务的隔离级别1、概念2、存在的问题3、隔离级别四、Jdbc事务控制1、概述2、控制事务的API:3、核心代码 事务 一、事务的基本介绍 1、概念 如果包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败。 2、操作 ① 开启事务:start transaction; ② 回滚:rollback; ③ 提交:commit; 3、操作实例 account.sql -- 创建account表 CREATE TABLE account( id INT PRIMA
Java与Oracle实现事务(JDBC事务)实例详解
主要介绍了Java与Oracle实现事务(JDBC事务)实例详解的相关资料,需要的朋友可以参考下
Java事务的简单代码
一个朋友要的,非常简单的java事务的处理代码.适合初学者看看!我已经写了注释了.


