首页 > 解决方案 > Oracle 非活动会话持有数据库锁

问题描述

在我们的应用程序线程转储中,我可以看到下面的可运行线程,而在 Oracle db DBA 中可以发现会话处于非活动状态,它正在持有锁定。在哪种情况下,oracle 会话在锁定表时会处于非活动状态?这导致数据库阻塞。

ajp-nio-8009-exec-37" prio=5 tid=0x175 nid=0xaf RUNNABLE (JNI Native Code) - stats: cpu=122796 blk=-1 wait=-1 java.lang.Thread.State: RUNNABLE at java .net.SocketInputStream.socketRead0(Native Method) at java.net.SocketInputStream.socketRead(SocketInputStream.java:116) at java.net.SocketInputStream.read(SocketInputStream.java:171) at java.net.SocketInputStream.read(SocketInputStream .java:141) 在 oracle.net.ns.Packet.receive(Packet.java:311) 在 oracle.net.ns.DataPacket.receive(DataPacket.java:105) 在 oracle.net.ns.NetInputStream.getNextPacket( NetInputStream.java:305) 在 oracle.net.ns.NetInputStream.read(NetInputStream.java:249) 在 oracle.net.ns.NetInputStream.read(NetInputStream.java:171) 在 oracle.net.ns.NetInputStream.read (NetInputStream.java:89) 在 oracle.jdbc.driver.T4CSocketInputStreamWrapper.readNextPacket(T4CSocketInputStreamWrapper.java:123) 在 oracle.jdbc.driver.T4CSocketInputStreamWrapper.read(T4CSocketInputStreamWrapper.java:79) 在 oracle.jdbc.driver.T4CMAREngineStream.unmarshalUB1(T4CMAREngineStream.java:429) 在 oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java :397)在 oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:257) 在 oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:587) 在 oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement。 java:225) 在 oracle.jdbc.driver.T4CPreparedStatement.executeForRows(T4CPreparedStatement.java:943) 在 oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement) 的 oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:53) .java:1150) 在 oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:4798) 在 oracle.jdbc.driver.OraclePreparedStatement。executeUpdate(OraclePreparedStatement.java:4875) - 锁定 oracle.jdbc.driver.T4CConnection@2ff33c0b

标签: multithreadingoraclelocking

解决方案


如果您使用 oracle,您必须对其连接强制执行最大生命周期,以便它不会返回连接池并如您观察到的那样造成泄漏

默认情况下,Oracle 不强制连接的最大生命周期

如果您使用 HikariCP 设置maxLifetime属性:

maxLifetime 此属性控制池中连接的最大生命周期。使用中的连接永远不会被淘汰,只有当它关闭时才会被删除。在逐个连接的基础上,应用较小的负衰减以避免池中的大规模灭绝。我们强烈建议设置此值,它应该比任何数据库或基础设施强加的连接时间限制短几秒钟。


推荐阅读