Oracle非活动会话持有数据库锁

时间:2018-11-06 08:47:59

标签: multithreading oracle locking

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

  

ajp-nio-8009-exec-37“ prio = 5 tid = 0x175 nid = 0xaf RUNNABLE(JNI本机代码)-统计信息:cpu = 122796 blk = -1 wait = -1 java.lang.Thread.State:在java.net.SocketInputStream的java.net.SocketInputStream.socketRead0(本机方法)处的RUNNABLE(在Java.net.SocketInputStream.read(SocketInputStream.java:171)处的java.net.SocketInputStream.socketRead(SocketInputStream.java:116)处。读取oracle.net.ns.Packet.receive(Packet.java:311)处的SocketInputStream.java:141)oracle.net.ns.NetInputStream处的oracle.net.ns.DataPacket.receive(DataPacket.java:105)处的(Packet.java:311) oracle.net.ns上的.getNextPacket(NetInputStream.java:305)。oracle.net.ns上的NetInputStream.read(NetInputStream.java:249)oracle.net.ns上的oracle.net.ns.NetInputStream.read(NetInputStream.java:171)位于oracle.jdbc.driver.T4CSocketInputStreamWrapper.readNextPacket(T4CSocketInputStreamWrapper.java:123)的oracle.jdbc.driver.T4CSocketInputStreamWrapper.read(T4CSocketInputStreamWrapper.java:79)的NetInputStream.read(NetInputStream.java:89)。 .T4CMAREngineStream.unma oracle.jdbc.driver上的rshalUB1(T4CMAREngineStream.java:429).oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:257)上的rshalUB1(T4CTTIfun.java:397)oracle.jdbc.driver.T4C8Oall oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:225)上的.doOALL(T4C8Oall.java:587)oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPrepareddriverment.java:53)在oracle.jdbc。位于oraclejdb的oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1150)处的oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:4798)处的T4CPreparedStatement.executeForRows(T4CPreparedStatement.java:943) .OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:4875)-锁定的oracle.jdbc.driver.T4CConnection@2ff33c0b

1 个答案:

答案 0 :(得分:0)

如果您使用oracle,则必须对其连接强制执行max lifetime,以使其不会返回连接池并按照您的观察创建泄漏

  

默认情况下,Oracle不强制连接的最长生存期

如果您使用HikariCP集maxLifetime属性:

  

maxLifetime   此属性控制池中连接的最大生存期。使用中的连接永远不会停止使用,只有在关闭连接后才将其删除。在逐个连接的基础上,应用较小的负衰减以避免池中的质量消灭。我们强烈建议设置该值,它应该比任何数据库或基础结构施加的连接时间限制短几秒钟。