我有一些在EJB中使用的遗留JDBC代码,在此代码中调用了setAutocommit()(出于可以理解的原因,托管事务不允许这样做。)
如果代码在托管事务中使用,我想跳过此方法调用,但如果在未管理的上下文中使用,则保留调用。
是否有标准化的方法来检测JDBC Connection对象是否“被管理”?
答案 0 :(得分:2)
有点不错的交易经理setAutoCommit(false)
和setTransactionIsolation(Connection.TRANSACTION_XXX)
。
根据所使用的JDBC驱动程序和事务管理器,您可能会对getAutoCommit()
和/或getTransactionIsolation()
感到满意。通过测试在两种情况下使用的值来确定,以便您可以学习如何区分这些值。
答案 1 :(得分:0)
对我来说,检查自动提交和事务隔离是不够的,因为它们被设置为相同的值(分别为false
和Connection.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();
}
}
我对这个解决方案不满意,所以如果有人有更好的想法,请告诉我!