【问题标题】:connection pooling: retrieve lost DB connection连接池:检索丢失的数据库连接
【发布时间】:2012-04-06 10:14:36
【问题描述】:

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

一般来说,实现两阶段提交的应用程序如何在数据库崩溃的情况下恢复(回滚)?恢复是应用程序的责任还是应该由事务管理器执行?

【问题讨论】:

    标签: jakarta-ee jdbc transactions db2 websphere


    【解决方案1】:

    我对 Atomikos 没有任何想法。

    一般来说,事务管理器负责恢复。通常在这种情况下,应用服务器 WAS 充当事务管理器并负责执行此活动。

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

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

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

    HTH

    芒露

    【讨论】:

    • 好的..那么您能对 DB2 的恢复有所了解吗?我的应用程序不执行连接检索活动。但是,DB连接丢失后,DB2数据库死锁(-911错误),即回滚没有成功完成。
    • 我没有看到 DB2 死锁的原因。这很令人惊讶
    • 更新在第一个 DB 上执行但未提交。我认为这是死锁的原因,不过,拥有一个两阶段提交协议应该理想地避免/恢复frm tht。
    【解决方案2】:

    我认为您的问题与恢复没有任何关系,因为它可能发生在准备好 2 阶段事务之前。

    如果你通过拔掉网线来模拟失败,那么应用服务器会很快注意到连接断开,即当应用程序尝试执行另一个数据库操作时。但是,在 DB2 端,连接看起来很空闲,DB2 或运行 DB2 的主机系统可能需要很长时间才能注意到连接断开。只有在连接被识别为断开时才会发生回滚。与此同时,由于连接持有的锁,您可能会遇到问题。

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

    【讨论】:

    • 谢谢安德烈亚斯..我会测试这个。但是有没有其他方法可以在不更改数据库服务器设置的情况下完成测试?我很确定不会为生产服务器修改此值。那我该如何确保恢复呢?
    • 严格来说,“恢复”是指解决有疑问的事务,即分布式事务,其中至少有一个参与者被要求准备事务,并且并非所有参与者都已提交/回滚。如果在准备好 DB2 事务之前发生故障(这很可能是您的场景中的情况),那么(对于该资源)不需要恢复,但锁定将一直存在,直到 DB2 检测到连接断开。如果事务已经准备好,那么无论使用哪个连接,恢复都应该成功。
    • 感谢您很好地解释它。我不知道现在继续。我猜 d 锁定 d DB 是由于 DB2 服务器设置而不是由于应用程序...让我看看我能做些什么来改变它。我也怀疑事务没有提交,因为它设置为 rollbackOnly,但我会为此发布一个新问题。
    猜你喜欢
    • 2020-11-12
    • 2023-03-19
    • 2019-12-31
    • 2013-04-27
    • 1970-01-01
    • 2014-04-09
    • 2015-08-09
    • 1970-01-01
    • 2015-06-27
    相关资源
    最近更新 更多