添加第二个持久性单元并将我的应用程序的数据源更改为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。
单个用户进行的小测试表明该应用程序似乎按预期工作,但是这条警告信息并不能让我感觉很舒服地向大众推广。
任何人都可以对这条消息有所了解吗?我的担忧有效吗?
答案 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: