在添加第二个持久化单元并将应用程序的数据源更改为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。
对单个用户进行的小测试表明,该应用程序似乎可以按预期工作,但这条警告消息并不能让我放心地将其推广到大众。
有没有人能解释一下这条信息?我的担忧是正确的吗?
发布于 2012-06-27 09:34:30
经过一些研究,我发现这个警告与使用XADataSource没有任何关系。我早些时候开始对EclipseLink的多租户进行了一些探索,结果发现这是罪魁祸首。
谈到http://wiki.eclipse.org/EclipseLink/Examples/JPA/Multitenant#Persistence_Usage_for_Multiple_Tenants
使用此体系结构时,常规实体类型可以使用共享缓存,但多租户类型必须在缓存中受到保护,因此必须将MULTITENANT_SHARED_EMF属性设置为true。
仅供参考--在审查代码时,ClassDescriptor.initializeCaching()中还有另外3种缓存隔离降级为PROTECTED的情况:
发布于 2012-05-31 20:47:43
这里的缓存实现只是尝试同步parnet和子实体的隔离级别。但我认为您应该覆盖默认的保护性隔离级别。因为"Serializeable“隔离级别是最具保护性且性能较差的级别。根据您的需求,您可以使用已提交读取或可重复读取级别。
发布于 2012-05-31 21:45:32
这只是一个关于缓存隔离的警告,它与数据库隔离无关,因此您可以忽略它。
有关缓存隔离的更多信息,请参见
http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Caching/Shared_and_Isolated
不过,如果您没有进行任何缓存配置,那就很奇怪了。默认情况下,所有内容都应该是共享的,要获得受保护的内容,您必须禁用相关实体的缓存,例如使用@Cacheable(false)?
https://stackoverflow.com/questions/10824508
复制相似问题