连接池:检索丢失的数据库连接

问题描述:

我正在实现分布式事务的2阶段提交(使用2个数据库)。我通过将网络电缆拉到桌面计算机上,然后将其插回来模拟DB服务器连接丢失。但是,这会导致事务在数据库连接对象丢失时执行“回滚”时失败。有没有一种方法可以检索丢失的数据库连接对象,或强制应用程序在特定时间段后尝试重新连接到同一个连接。 我正在使用DB2和Websphere 6.1作为应用程序服务器。数据库连接通过jndi查找。使用Atomikos作为事务管理器。连接池:检索丢失的数据库连接

通常情况下,在数据库崩溃的情况下,实现两阶段提交的应用程序如何恢复(回滚)?恢复是应用程序的责任还是交易经理应该这样做?

我不认为你的问题有什么用回收做的,因为它准备了2期交易之前可能发生。

如果您通过拔下网络电缆来模拟故障,则应用程序服务器将很快注意到连接中断,即应用程序尝试执行其他数据库操作时。但是,在DB2方面,连接看起来是空闲的,并且DB2或DB2运行的主机系统可能需要很长时间才能注意到连接中断。一旦连接被识别为断开,回滚将只发生。与此同时,由于连接所持有的锁,您可能会遇到问题。

如果您希望减少DB2在连接上启动回滚之前花费的时间,那么您可能需要调整服务器上的TCP保持连接设置。

+0

谢谢安德烈亚斯..我会测试这个。 但是有没有其他方式可以在不更改数据库服务器设置的情况下进行测试?我大多确信这个值将被修改用于生产服务器。我如何确保恢复呢? – Andy 2012-03-23 15:44:57

+1

严格地说,“恢复”意味着解决有问题的交易,即分布式交易,其中至少有一个参与者已被要求准备交易,并非所有参与者都已提交/回滚。如果在DB2事务准备好之前(在您的方案中可能出现这种情况)发生故障,则不需要恢复(对于该资源),但锁将保持到DB2检测到连接中断。如果事务已经准备好,那么无论使用哪个连接,恢复都应该成功。 – 2012-03-24 17:09:31

+0

感谢您解释它..现在我已经开始了。我想锁定在DB是由于DB2服务器设置,而不是由于应用程序...让我看看我可以做的改变这个笏。我也怀疑这笔交易没有作为其回滚的原因,但我会为此发布一个新问题。 – Andy 2012-03-26 15:11:12

我对Atomikos没有任何的想法。

通常,事务管理器负责恢复。通常,在这种情况下,应用程序服务器将充当事务管理器并负责执行此活动。

数据库连接丢失后,将收到StaleConnectionException,WAS运行时将清除该连接或该数据库连接池中的所有数据库连接(取决于您已配置的内容)。

在来自ds.getConnection的下一个请求时,应用程序可以使用新的连接。

应用程序不需要执行任何恢复活动(就数据库而言)。

HTH

Manglu

+0

好的,你可以从DB2恢复中了解一些情况吗?我的应用程序不执行连接检索活动。但是,在数据库连接丢失后,DB2数据库会死锁(-911错误),即回滚没有成功完成。 – Andy 2012-03-22 01:57:58

+0

我在这里看不到DB2死锁的原因。这是令人惊讶的 – Manglu 2012-03-23 05:54:09

+0

更新在第一个数据库上执行但未提交。我认为要解决死锁的原因,尽管有两阶段提交协议应该理想地避免/恢复。 – Andy 2012-03-23 13:52:07