从EclipseLink获取JDBC连接

时间:2012-07-29 16:05:20

标签: jpa jdbc connection eclipselink

使用EclipseLink作为JPA 2.0提供程序,只需调用

即可获得JDBC连接
Connection con = entityManager.unwrap(Connection.class);

但我不确定我应该对此负责。提交查询后是否必须关闭连接?或者我不允许关闭连接,因为EclipseLink也在内部使用此连接。或者它不在乎,因为如果我不这样做,EclipseLink会观察我的行为并自动关闭连接?

2 个答案:

答案 0 :(得分:10)

如果您处于JPA事务的上下文中,则连接将由提供程序(EclipseLink)管理。如果您不在交易中,则自己负责管理连接。

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

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

答案 1 :(得分:1)

  

但我不确定我应该对此负责。我必须关闭   提交查询后连接?或者我不被允许   关闭连接,因为EclipseLink也使用此连接   内部。

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

关于EclipseLink ,根据我从source获得的内容:

EclipseLink为当前有效connection提供参考,用于当前有效客户端会话交易。如果没有活动的交易,则会创建新的,与会话相关联并从unwrap()方法返回。

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

如果您可以参考内部eclipselink类,则可以访问eclipselink内部连接池以获得Connection专用(请查看org.eclipse.persistence.sessions.server.ServerSession.getConnectionPool(String))。