Получение соединения JDBC от EclipseLink

используя EclipseLink в качестве поставщика JPA 2.0, я могу получить соединение JDBC, просто позвонив

Connection con = entityManager.unwrap(Connection.class);

Но я не уверен, за что я несу ответственность. Должен ли я закрыть соединение после отправки моих запросов? Или мне не разрешено закрывать соединение, потому что EclipseLink также использует это соединение внутри. Или это не волнует, потому что EclipseLink наблюдает за моим поведением и автоматически закрывает соединение, если я этого не делаю?

Ответ 1

Если вы находитесь в контексте транзакции JPA, соединение будет управляться провайдером (EclipseLink). Если вы находитесь за пределами транзакции, вы сами отвечаете за управление соединением.

Дополнительную информацию см. В следующей ссылке:

http://wiki.eclipse.org/EclipseLink/Examples/JPA/EMAPI#Getting_a_JDBC_Connection_from_an_EntityManager

Ответ 2

Но я не уверен, за что я несу ответственность. Должен ли я закрыть соединение после отправки моих запросов? Или мне не разрешено закрывать соединение, потому что EclipseLink также использует это соединение внутри.

Хороший и правильный вопрос. Кажется, что в документации отсутствует семантика вызовов unwrap().

Что касается EclipseLink, в соответствии с тем, что я получил от источника:

EclipseLink дает вам ссылку на текущее активное connection которое оно использует для текущей транзакции сеанса клиента. Если транзакция не активна, будет создан новый, связанный с сеансом и возвращенный с помощью метода unwrap().

В результате IMHO, фиксация/откат такого полученного Connection может привести к неопределенному поведению и/или исключениям. То же самое верно для выполнения DML, которые ранее были зашифрованы записями с помощью кэшей eclipselink или для которых существуют управляемые объекты.
Поэтому при использовании этого API, особенно если основная транзакция грязная, будьте осторожны.

Если вы можете обратиться к внутренним классам eclipselink, вы можете получить доступ к внутреннему пулу подключений eclipselink для получения Connection исключительно (посмотрите на org.eclipse.persistence.sessions.server.ServerSession.getConnectionPool(String)).