【问题标题】:Keeping DB connection alive during distributed transaction在分布式事务期间保持数据库连接处于活动状态
【发布时间】:2014-11-30 16:51:02
【问题描述】:

我在 JBoss EAP 6.2 上使用 EJB 在 Java 中有一个长时间运行的分布式事务。问题是,首先我必须修改一个数据库中的数据,然后多次调用一些 Web 服务,根据我从这些 Web 服务获得的结果,我还必须修改同一个数据库中的数据。

这些网络服务有点慢,我在应用程序服务器和数据库服务器之间的状态防火墙在事务结束之前终止了与数据库的连接,因为它有一段时间不活动。我无法重新配置上述防火墙。

我的问题是:在整个事务中保持数据库连接处于活动状态的最佳方法是什么?

【问题讨论】:

    标签: database jakarta-ee transactions xa


    【解决方案1】:

    概括您的要求。您需要:

    1. 在 DB1 上执行更新操作。
    2. 执行各种 WS 操作。
    3. 根据第 2 步的结果,更新 DB2。

    然后你说你的问题是保持你的数据库连接。您没有提到哪个,但我想这一定是针对 DB2 的。您还在谈论事务,所以我想您必须使用带有 CMT 或 BMT 的会话 Bean。

    我认为您遇到的是事务超时而不是数据库连接超时。 我不使用 EAP,但根据我使用各种 JBOSS 版本的经验,这些版本必须在 30 秒左右。

    如果您遇到上述情况,您有两种选择:

    1. 全局增加 tx 超时值,我不建议这样做。
    2. 使用自定义 @TransactionTimeout 注释或调整 JBOSS jboss-ejb3.xml 部署描述符。

    例子:

    带注释:

    @TransactionTimeout(value = 10, unit = TimeUnit.SECONDS)

    用jboss-ejb3.xml:

    <assembly-descriptor>
        <container-transaction>
            <method>
                <ejb-name>BeanWithTimeoutValue</ejb-name>
                <method-name>*</method-name>
                <method-intf>Local</method-intf>
            </method>
            <tx:trans-timeout>
                <tx:timeout>10</tx:timeout>
                <tx:unit>Seconds</tx:unit>
            </tx:trans-timeout>
        </container-transaction>
    </assembly-descriptor>
    

    以上所有内容均来自 Jboss 7.1 文档,请特别注意以上内容仅适用于新事务。

    见: Jboss 7.1 documentation

    【讨论】:

    • 为了简化我的问题,我没有提到任何其他数据库,所以假设我只有 DB1。我确定这不是事务超时。这是防火墙杀死连接。
    • 我又错过了一些东西。您说“防火墙正在终止连接”。从逻辑上讲,这必须是 WS 连接。对吗?
    猜你喜欢
    • 2011-01-06
    • 2012-01-03
    • 2021-09-13
    • 2013-08-27
    • 2019-09-01
    • 2010-11-19
    • 1970-01-01
    • 2016-09-07
    • 2013-01-27
    相关资源
    最近更新 更多