父实体的缓存隔离级别警告

时间:2012-05-30 21:26:19

标签: caching jpa-2.0 eclipselink glassfish-3 isolation-level

添加第二个持久性单元并将我的应用程序的数据源更改为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类的隔离级别为“PROTECTED”。文档没有说明可能导致它自动分配到该级别的内容 - 请参阅user guide

单个用户进行的小测试表明该应用程序似乎按预期工作,但是这条警告信息并不能让我感觉很舒服地向大众推广。

任何人都可以对这条消息有所了解吗?我的担忧有效吗?

3 个答案:

答案 0 :(得分:0)

这里的缓存实现只是尝试同步parnet和子实体的隔离级别。但我认为你应该覆盖默认的保护隔离级别。因为“可序列化”隔离级别是最具保护性且性能较差的隔离级别。您可以根据需要使用Read Committed或Repeatable Read级别。

答案 1 :(得分:0)

这只是关于缓存隔离的警告,它与数据库隔离无关,因此您可以忽略它。

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

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

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

答案 2 :(得分:0)

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

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

  

使用此体系结构时,常规实体类型可以使用共享缓存,但缓存中的Multitenant类型必须是PROTECTED,因此必须将MULTITENANT_SHARED_EMF属性设置为true。

仅供参考 - 在审查代码时,ClassDescriptor.initializeCaching()中还有其他3个案例,其中缓存隔离降级为PROTECTED:

  1. 如果实体有DatabaseMapping将其标记为不可缓存。
  2. 如果实体的ForeignReferenceMapping没有共享的隔离级别。
  3. 如果实体的AggregateObjectMapping没有共享的隔离级别。