使用 EclipseLink 作为 JPA 2.0 提供程序,我可以通过简单地调用来获得 JDBC 连接
Connection con = entityManager.unwrap(Connection.class);
但我不确定我要负责什么。提交查询后是否必须关闭连接?还是我不允许关闭连接,因为 EclipseLink 也在内部使用这个连接。还是它不在乎,因为 EclipseLink 会观察我的行为并在我不这样做时自动关闭连接?
使用 EclipseLink 作为 JPA 2.0 提供程序,我可以通过简单地调用来获得 JDBC 连接
Connection con = entityManager.unwrap(Connection.class);
但我不确定我要负责什么。提交查询后是否必须关闭连接?还是我不允许关闭连接,因为 EclipseLink 也在内部使用这个连接。还是它不在乎,因为 EclipseLink 会观察我的行为并在我不这样做时自动关闭连接?
如果您在 JPA 事务的上下文中,则连接将由提供者 (EclipseLink) 管理。如果您在事务之外,您有责任自己管理连接。
有关其他信息,请参阅以下链接:
但我不确定我要负责什么。提交查询后是否必须关闭连接?还是我不允许关闭连接,因为 EclipseLink 也在内部使用这个连接。
一个好的和有效的问题。似乎文档缺少unwrap()
调用的语义。
关于 EclipseLink,根据我从源代码中得到的信息:
EclipseLink 为您提供了对当前活动的引用connection
,它用于当前活动的客户端会话事务。如果没有事务处于活动状态,则将创建一个新事务,与会话相关联并从unwrap()
方法返回。
因此,恕我直言,此类获得的提交/回滚Connection
可能会导致未定义的行为和/或异常。执行 DML 也是如此,更改的记录先前已由 eclipselink 内部缓存缓存或存在托管实体。
所以在使用这个 API 的时候,尤其是底层事务脏的时候,要小心。
如果你可以参考内部的eclipselink类,你可以访问eclipselink内部连接池来获得一个Connection
独占(看看org.eclipse.persistence.sessions.server.ServerSession.getConnectionPool(String)
)。