【问题标题】:Getting a JDBC connection from EclipseLink从 EclipseLink 获取 JDBC 连接
【发布时间】:2012-07-27 11:36:18
【问题描述】:

使用 EclipseLink 作为 JPA 2.0 提供者,我可以通过简单的调用获得 JDBC 连接

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

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

【问题讨论】:

  • 为什么需要连接? JPA 在大多数情况下都使用 EntityManager。
  • 调用存储过程。我的 DBMS 不支持通过 EclipseLink 调用它们。
  • EclipseLink 无法为您处理存储过程的 DBMS 是什么?

标签: jpa jdbc connection eclipselink


【解决方案1】:

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

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

关于 EclipseLink,根据我从source 得到的信息:

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

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

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

【讨论】:

    【解决方案2】:

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

    有关更多信息,请参阅以下链接:

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

    【讨论】:

    • 我有问题。事务总是提交更改,即使我将对实体管理器进行回滚。我正在使用 Informix db 和 ifxjdbc 驱动程序。事务由应用程序管理。第二个问题是 eclipselink 在 unwrap(java.sql.Connection) 上返回 null。将 eclipselink 2.5.1 与旧 SGES2.1.1 一起使用。
    • 已解决:EclipseLink wiki 错误,但它的展开方法是正确的。我今天修复了 Eclipselink 的 wiki。
    • 不确定这是否相关,但截至 2019 年 7 月,使用 eclipselink 2.5.0 和 querydsl 4.2.1,建议的 unwrap(Connection.class) 方法在我自己的项目中返回 null。通过创建所需的 JPASQLQuery 并将现有 entityManager 作为参数传递来解决它(请参阅querydsl.com/static/querydsl/4.2.1/apidocs/com/querydsl/jpa/sql/…
    猜你喜欢
    • 1970-01-01
    • 2015-03-25
    • 2017-09-03
    • 1970-01-01
    • 2017-11-09
    • 2015-02-08
    • 1970-01-01
    • 2013-04-13
    • 2012-11-04
    相关资源
    最近更新 更多