使用EclipseLink作为JPA 2.0提供程序,只需调用
即可获得JDBC连接Connection con = entityManager.unwrap(Connection.class);
但我不确定我应该对此负责。提交查询后是否必须关闭连接?或者我不允许关闭连接,因为EclipseLink也在内部使用此连接。或者它不在乎,因为如果我不这样做,EclipseLink会观察我的行为并自动关闭连接?
答案 0 :(得分:10)
如果您处于JPA事务的上下文中,则连接将由提供程序(EclipseLink)管理。如果您不在交易中,则自己负责管理连接。
有关其他信息,请参阅以下链接:
答案 1 :(得分:1)
但我不确定我应该对此负责。我必须关闭 提交查询后连接?或者我不被允许 关闭连接,因为EclipseLink也使用此连接 内部。
一个好而有效的问题。似乎文档缺少unwrap()
调用的语义。
关于EclipseLink ,根据我从source获得的内容:
EclipseLink为当前有效connection
提供参考,用于当前有效客户端会话交易。如果没有活动的交易,则会创建新的,与会话相关联并从unwrap()
方法返回。
因此,恕我直言,这样获得的Connection
的提交/回滚可能导致未定义的行为和/或异常。执行DML也是如此,其中已更改的记录先前已由eclipselink内部缓存缓存或存在托管实体。
因此,在使用此API时,尤其是如果基础事务变脏,请小心。
如果您可以参考内部eclipselink类,则可以访问eclipselink内部连接池以获得Connection
专用(请查看org.eclipse.persistence.sessions.server.ServerSession.getConnectionPool(String)
)。