0

我想在同一个应用程序中通过 JPA/Eclipselink 和 JDBC Connections 访问持久层。

问题是,直接使用 JDBC 连接进行的更改不会反映到 JPA EntityManager,即使我之后打开新创建的 EntityManager。

我对 JDBC Connections 和 JPA EntityManagers 都使用了 Tomcats JDBC-Connection 池。

有没有办法处理这种“冲突”?我发现了这个:在 JPA (eclipselink) 中禁用缓存

我也发现了这个:http ://wiki.eclipse.org/EclipseLink/Examples/JPA/EMAPI#Getting_a_JDBC_Connection_from_an_EntityManager但我不喜欢这个想法,因为使用 JDBC-Connections 的代码在一个单独的库中,应该根本不使用 JPA。

是否有最先进的解决方案可以与 JDBC-Connections 和 JPA/Eclipselink-Connections 一起工作?

4

2 回答 2

1

您是否尝试过禁用共享缓存?JPA 允许两个级别的缓存——在工厂(共享)级别和在 EM 本身内保存托管实体。如果您在 JPA 之外进行更改,则需要考虑这些缓存。使用来自 JPA 的连接无法解决此问题,因为它仍然没有挂钩到 JPA 的缓存中。因此,只有在清除 em 或刷新涉及更改的实体时,才能看到 EM 之外的更改。

我会使用 http://wiki.eclipse.org/EclipseLink/Examples/JPA/Caching 和James 在堆栈中的回答提供的http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Caching链接溢出问题作为参考。

在同一个应用程序中使用 JDBC 与在不同的应用程序中进行更改基本相同,只是 JPA 应用程序可能对所做的更改有更多的控制和知识,从而允许发生特定的失效或刷新。因此,虽然禁用共享缓存可能是最简单/最快的解决方案,但 EclipseLink 失效和有针对性的刷新可能仍然允许获得缓存的好处。

于 2013-11-14T16:10:51.560 回答
0

我想回答我自己的问题。

就我而言,我有一系列这样的操作:

  1. 使用 JPA EntityManager
  2. 使用 JDBC 连接
  3. 使用 JPA EntityManager

在上述场景中,可能会在步骤 3 中处理无效数据。

这是操作的工作序列:

  1. 使用 JPA EntityManager
  2. 关闭实体管理器
  3. 使用 JDBC 连接
  4. 关闭 JDBC 连接
  5. 创建一个新的 JPA EntityManager
  6. 刷新所有缓存: em.getEntityManagerFactory().getCache().evictAll(); (1)
  7. 使用 JPA EntityManager

在这种特殊的操作序列中(当一个人必须在并发环境中工作时会有所不同),这比禁用整个应用程序的缓存要好。

有关此问题的更一般的答案,请参阅上面的 Chris anwser。

(1) http://wiki.eclipse.org/EclipseLink/Examples/JPA/Caching

于 2013-11-14T17:02:44.453 回答