2010-10-05 2 views
2

У меня есть старый код JDBC, который используется в EJB, в этом коде сделан вызов setAutocommit() (который не разрешен для управляемых транзакций по понятным причинам).Есть ли способ определить, что соединение управляется?

Я бы хотел пропустить этот вызов метода, если код используется в управляемой транзакции, но пусть этот вызов останется, если он используется в неуправляемом контексте.

Существует ли стандартизированный способ определения того, является ли объект соединения JDBC «управляемым» или нет?

ответ

2

Немного приличный менеджер транзакций делает setAutoCommit(false) и setTransactionIsolation(Connection.TRANSACTION_XXX).

В зависимости от драйвера JDBC и используемого менеджера транзакций вам может быть повезло с getAutoCommit() и/или getTransactionIsolation(). Определите, проверяя, какие значения используются в обоих случаях, чтобы вы могли научиться отличать одно от другого.

+0

Хороший совет! В конце концов я решил просто пропустить setAutoCommit, хотя, поскольку я понял, что код, который я использовал, действительно будет использоваться в контейнере в любом случае в любом случае, и, надеюсь, будет полностью отменен в ближайшее время, но ваши предложения кажутся хорошим решением, которое мне нужно сделать это. – Brummo

0

Для меня проверка автоматической фиксации и изоляции транзакций была недостаточной, поскольку они были установлены на одинаковое значение (false и Connection.TRANSACTION_READ_COMMITTED соответственно), как при соединении, предоставляемом Hibernate напрямую (автономно), так и при запуске внутри Контейнер JEE (управляемые транзакции).

Поскольку я не нашел никаких других атрибутов, я закончил использовать следующий код, который проверяет, имеет ли соединение тип org.jboss.jca.adapters.jdbc.jdk7.WrappedConnectionJDK7 (или аналогичный).

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

Я не доволен этим решением, поэтому, если у кого-то есть лучшая идея, пожалуйста, дайте мне знать!