【问题标题】:Weblogic EJB CMT: Transaction does not rollbackWeblogic EJB CMT:事务不回滚
【发布时间】:2013-11-30 07:12:22
【问题描述】:

我遵循规范中指定的 CMP 的 EJB 标准,但它不会回滚数据库中的更改。当我注释掉Connection.close()Connection 是从数据源中检索到的)时,它会成功回滚。

是否建议 WebLogic 不关闭从数据源接收的连接?

【问题讨论】:

  • 我认为您的问题与打开/关闭连接无关。尝试发布一些代码来显示您正在尝试做的事情。
  • 我得到了解决方案,事务与关闭/打开连接无关,而不是与 DataSource>Transation>GlobalTransaction 设置有关,但是 weblogic 建议不要关闭从 dataSource 接收的连接。

标签: ejb weblogic ejb-3.0 ejb-3.1 weblogic12c


【解决方案1】:

是否建议 WebLogic 不关闭从数据源接收的连接?

有一条规则是,在容器管理的事务中,您永远不应调用任何手动或本机与事务资源上的事务交互的方法。

但是Connection.close()不是这样的方法。即使管理连接,当您从注入的数据源获取连接时,您确实必须关闭它。请注意,在大多数情况下,这实际上不会关闭连接,但是当事务正在进行时,事务管理器很可能会保持连接,以便在整个事务提交时能够对其进行提交或回滚。回滚。

请注意,当使用 try-with-resources 构造时,可以自动关闭连接。否则,您确实必须对其调用 close() 方法(包含在一定数量的 finally 子句中)。

这是一个相当标准的模式:

@Stateless
public class MyEJB {

    @Resource(lookup = "java:app/dataSource")
    private DataSource dataSource;

    public void doStuff() {
        try (Connection connection = dataSource.getConnection()) {
            // do work on connection
        } catch (SQLException e) {
            // handle exception
        }
    }
}

有关此主题的更多讨论,请参阅此链接:http://www.coderanch.com/t/485357/EJB-JEE/java/releasing-connection-CMT

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-21
    • 1970-01-01
    • 2011-11-15
    • 1970-01-01
    • 1970-01-01
    • 2013-08-15
    • 1970-01-01
    相关资源
    最近更新 更多