jdbc事务中提交几千条update,未等commit即报Connection timed out,是否会造成锁表

dinghun8leech 2017-10-27 03:18:44
场景如下:
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是否会在一定时间后自动解锁?
谢谢!
...全文
866 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
minsic78 2017-12-01
  • 打赏
  • 举报
回复
引用 3 楼 dinghun8leech 的回复:
感谢楼上两位。 问题原因找到了,是update的那张表数据量大(每天240w),没加索引,导致操作耗尽了主机资源,于是频频timeout。加了索引后一切正常了。
楼主真是大方
dinghun8leech 2017-12-01
  • 打赏
  • 举报
回复
感谢楼上两位。 问题原因找到了,是update的那张表数据量大(每天240w),没加索引,导致操作耗尽了主机资源,于是频频timeout。加了索引后一切正常了。
minsic78 2017-10-28
  • 打赏
  • 举报
回复
锁和等待锁而不得是两回事情,楼主的问题还是在前面吧,就是为啥就突然断掉了,能重现?更新量少也断?更新语句特别复杂?或者牵涉到复杂的视图?
碧水幽幽泉 2017-10-27
  • 打赏
  • 举报
回复
问题1: 这个应该放到java版块去问。本人8年没搞java了,jdbc连接问题都忘记差不多了。 问题2: 只要不往表再进行写操作,一段时间之后,oracle会自动解锁。解锁的时间与表的数据量大小,网络,系统负载均衡等有关。

17,082

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧