有没有办法确定连接是否被管理?

时间:2010-10-05 16:42:49

标签: java jdbc transactions java-ee connection

我有一些在EJB中使用的遗留JDBC代码,在此代码中调用了setAutocommit()(出于可以理解的原因,托管事务不允许这样做。)

如果代码在托管事务中使用,我想跳过此方法调用,但如果在未管理的上下文中使用,则保留调用。

是否有标准化的方法来检测JDBC Connection对象是否“被管理”?

2 个答案:

答案 0 :(得分:2)

有点不错的交易经理setAutoCommit(false)setTransactionIsolation(Connection.TRANSACTION_XXX)

根据所使用的JDBC驱动程序和事务管理器,您可能会对getAutoCommit()和/或getTransactionIsolation()感到满意。通过测试在两种情况下使用的值来确定,以便您可以学习如何区分这些值。

答案 1 :(得分:0)

对我来说,检查自动提交和事务隔离是不够的,因为它们被设置为相同的值(分别为falseConnection.TRANSACTION_READ_COMMITTED),这两者都是由Hibernate直接提供的连接(独立的)以及在JEE容器内运行时(托管事务)。

由于我没有找到任何其他属性,我最终使用以下代码,检查Connection是否为org.jboss.jca.adapters.jdbc.jdk7.WrappedConnectionJDK7类型(或类似)。

if (!conn.getAutoCommit()) {
    if (!conn.getClass().getName().startsWith("org.jboss.jca.")) {
        conn.commit();
    }
}

我对这个解决方案不满意,所以如果有人有更好的想法,请告诉我!