处理突然的连接丢失和SELECT FOR UPDATE
考虑这种情况:
部署到应用程序服务器群集的服务器端应用程序通常会发出SELECT FOR UPDATE
个查询,更新数据和提交事务。
因此,在某个时间点存在锁定记录(在SFU
和当前事务结束之间)。
假设在提交事务之前,服务器节点出现故障或连接因任何原因而丢失。
在这种情况下,与此连接关联的数据库会话将保持打开状态,并且事务将在这些锁定到位时可能无限期地处于活动状态。
这将阻止以后尝试更新至少一个锁定记录的所有其他事务,从而破坏应用程序。
这是一个有效的问题吗?
如果是,我可以通过以下方式阻止它吗?
在Oracle方面:
ALTER PROFILE
创建一个{1}}比如说1分钟在Java端配置连接池(这个例子对于Tomcat的池,但Weblogic和其他人有它们的等价物):
IDLE_TIME
testWhileIdle=true
(30秒)timeBetweenEvictionRunsMillis=30000
所以我想要实现的是让服务器定期ping未使用的连接(从Oracle的角度来看它们是活着的)如果ping请求停止进入超过1分钟,Oracle应该放弃会话(从而释放锁)。
它能解决这个问题吗?你能看到这种方法有什么问题吗?