我正在为分布式事务实现两阶段提交(使用2个数据库)。我通过将网络电缆拉到我的桌面计算机然后再将其插回来模拟数据库服务器连接丢失。但是,这会导致事务在执行“回滚”时失败,因为数据库连接对象丢失。有没有办法可以检索丢失的数据库连接对象或强制应用程序尝试在某个时间段后重新连接到同一连接。 我使用DB2和Websphere 6.1作为应用服务器。数据库连接是通过jndi查找。使用Atomikos作为事务管理器。
通常,在数据库崩溃的情况下,实现两阶段提交的应用程序如何恢复(回滚)?恢复是应用程序的责任还是事务管理器应该这样做?
答案 0 :(得分:2)
我不认为您的问题与恢复有任何关系,因为它可能发生在准备两阶段交易之前。
如果您通过拔下网络电缆来模拟故障,那么应用服务器将很快发现连接已断开,即当应用程序尝试执行另一个数据库操作时。但是,在DB2端,连接看起来只是空闲,DB2或运行DB2的主机系统可能需要很长时间才能注意到连接已断开。只有在连接被识别为已损坏时才会发生回滚。与此同时,由于连接保持锁定,您可能会遇到问题。
如果要减少DB2在连接上启动回滚之前所花费的时间,那么您可能希望调整服务器上的TCP保持活动设置。
答案 1 :(得分:1)
我对Atomikos一无所知。
通常,事务管理器负责恢复。通常,在这种情况下,应用程序服务器WAS充当事务管理器并负责执行此活动。
一旦数据库连接丢失,将收到StaleConnectionException,WAS运行时将清除此连接或该数据库的连接池中的所有数据库连接(取决于您配置的内容)。
根据ds.getConnection的下一个请求,应用程序可以使用新连接。
应用程序不需要执行任何恢复活动(就数据库而言)。
HTH
Manglu