1

添加第二个持久性单元并将我的应用程序的数据源更改为 XADataSource (MySQL) 后,我现在在 glassfish 日志中收到关于我父实体的隔离级别的令人困惑的警告:

WARN  o.e.p.s.f.j.ejb_or_metadata : Parent Entity BaseEntity has an isolation
level of: PROTECTED which is more protective then the subclass Contact with
isolation: null so the subclass has been set to the isolation level PROTECTED.

经过一番研究,我认为这个隔离级别警告消息来自 EclipseLink 的缓存机制。但我没有在我的应用程序的任何地方指定隔离级别,因此我的配置中的某些内容似乎触发了 BaseEntity 类的隔离级别为“受保护”。该文档没有说明可能导致它被自动分配到该级别的原因 - 请参阅用户指南

对单个用户的小规模测试表明,该应用程序似乎按预期工作,但这条警告消息并没有让我觉得将它推广给大众感到不舒服。

任何人都可以对此信息有所了解吗?我的担忧有效吗?

4

3 回答 3

0

经过一番研究,我发现这个警告与使用 XADataSource 无关。我早些时候开始对 EclipseLink 的多租户进行一些探索,结果发现这是罪魁祸首。

参考http://wiki.eclipse.org/EclipseLink/Examples/JPA/Multitenant#Persistence_Usage_for_Multiple_Tenants

使用此架构时,有一个可用于常规实体类型的共享缓存,但多租户类型必须在缓存中受到保护,因此 MULTITENANT_SHARED_EMF 属性必须设置为 true。

仅供参考——在查看代码时,ClassDescriptor.initializeCaching() 中还有其他 3 种情况,其中缓存隔离被降级为 PROTECTED:

  1. 如果实体有一个 DatabaseMapping 将其标记为不可缓存。
  2. 如果实体具有不具有共享隔离级别的 ForeignReferenceMapping。
  3. 如果实体具有不具有共享隔离级别的 AggregateObjectMapping。
于 2012-06-27T01:34:29.820 回答
0

这里的缓存实现只是试图同步parnet和子实体的隔离级别。但我认为你应该覆盖默认的保护隔离级别。因为“Serializeable”隔离级别是最具保护性且性能较差的隔离级别。您可以使用已提交读或可重复读级别,具体取决于您的要求。

于 2012-05-31T12:47:43.343 回答
0

这只是一个关于缓存隔离的警告,它与数据库隔离无关,所以你可以忽略它。

有关缓存隔离的更多信息,请参阅,

http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Caching/Shared_and_Isolated

如果您还没有进行任何缓存配置,那就太奇怪了。默认情况下,所有内容都应该是共享的,要获得受保护的内容,您必须禁用相关实体的疼痛,例如使用 @Cacheable(false)?

于 2012-05-31T13:45:32.217 回答