15

使用 EclipseLink 作为 JPA 2.0 提供程序,我可以通过简单地调用来获得 JDBC 连接

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

但我不确定我要负责什么。提交查询后是否必须关闭连接?还是我不允许关闭连接,因为 EclipseLink 也在内部使用这个连接。还是它不在乎,因为 EclipseLink 会观察我的行为并在我不这样做时自动关闭连接?

4

2 回答 2

10

如果您在 JPA 事务的上下文中,则连接将由提供者 (EclipseLink) 管理。如果您在事务之外,您有责任自己管理连接。

有关其他信息,请参阅以下链接:

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

于 2012-07-30T14:55:02.367 回答
1

但我不确定我要负责什么。提交查询后是否必须关闭连接?还是我不允许关闭连接,因为 EclipseLink 也在内部使用这个连接。

一个好的和有效的问题。似乎文档缺少unwrap()调用的语义。

关于 EclipseLink,根据我从源代码中得到的信息:

EclipseLink 为您提供了对当前活动的引用connection,它用于当前活动的客户端会话事务。如果没有事务处于活动状态,则将创建一个新事务,与会话相关联并从unwrap()方法返回。

因此,恕我直言,此类获得的提交/回滚Connection可能会导致未定义的行为和/或异常。执行 DML 也是如此,更改的记录先前已由 eclipselink 内部缓存缓存或存在托管实体。
所以在使用这个 API 的时候,尤其是底层事务脏的时候,要小心

如果你可以参考内部的eclipselink类,你可以访问eclipselink内部连接池来获得一个Connection独占(看看org.eclipse.persistence.sessions.server.ServerSession.getConnectionPool(String))。

于 2014-10-13T15:04:22.540 回答