Weblogic EJB CMT:事务不回滚

时间:2013-11-30 07:12:23

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

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

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

1 个答案:

答案 0 :(得分: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