Есть ли способ определить, что соединение управляется? - PullRequest
2 голосов
/ 05 октября 2010

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

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

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

Ответы [ 2 ]

2 голосов
/ 06 октября 2010

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

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

0 голосов
/ 15 марта 2016

Для меня проверки автоматической фиксации и изоляции транзакции было недостаточно, поскольку для них было установлено одинаковое значение (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();
    }
}

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

...