在分布式事务期间保持DB连接活动

时间:2014-11-30 16:51:02

标签: database java-ee transactions xa

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

这些Web服务有点慢,我在应用程序服务器和数据库服务器之间建立的状态防火墙会在事务结束之前终止与数据库的连接,因为它在一段时间内处于非活动状态。我无法重新配置防火墙。

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

1 个答案:

答案 0 :(得分:0)

概括您的要求。你需要:

  1. 在DB1上执行更新操作。
  2. 执行各种WS操作。
  3. 根据步骤2的结果,更新DB2。
  4. 然后你说你的问题是保持你的数据库连接。你没有提到哪个,但我想必须是DB2。你也在谈论交易,所以我猜你必须使用CMT或BMT的会话Bean。

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

    如果您的情况如上,您有两种选择:

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

      带注释:

      @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