multithreading - 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
解决方案
如果您使用 oracle,您必须对其连接强制执行最大生命周期,以便它不会返回连接池并如您观察到的那样造成泄漏
默认情况下,Oracle 不强制连接的最大生命周期
如果您使用 HikariCP 设置maxLifetime属性:
maxLifetime 此属性控制池中连接的最大生命周期。使用中的连接永远不会被淘汰,只有当它关闭时才会被删除。在逐个连接的基础上,应用较小的负衰减以避免池中的大规模灭绝。我们强烈建议设置此值,它应该比任何数据库或基础设施强加的连接时间限制短几秒钟。
推荐阅读
- c++ - 消除指向重载的 const 成员函数和成员运算符的指针
- python - Tornado http 服务器 - 无法加载响应数据 - 反应应用程序块
- firebase - flutter firebase 从 Firestore 获取数组并将其分配给列表
- javascript - 使用 HTML 更改用户输入或 URL 的单选按钮或下拉菜单
- hazelcast-jet - Hazlecast Jet Cluster 处理重复项
- python - Tensorflow Keras - UnknownError:UnidentifiedImageError
- javascript - React 本机应用程序检测后台应用程序活动
- listview - 包含 ListView 的 Xamarin.Forms 滚动屏幕
- c++ - 'char*' 类型的一般问题 - C++
- linux - linux globbing 中的 [01]、[0-1] 和 [0,1] 有什么区别?