【发布时间】:2017-12-17 02:21:33
【问题描述】:
在我们的项目中,EclipseLink 的“旧”本机(非 JPA)版本仍在使用中。使用 Workbench 应用程序(生成 XML 配置文件和一些 Java 代码)配置映射。
我们在工作台工具中看到的:对于所有实体来说,缓存似乎都启用了隔离级别 Shared(默认)。
我们在应用程序中看到的:没有实体被缓存
我们想要的:只为少数几个实体启用二级缓存
编辑
EclipseLink Workbench 中的配置:
生成的 XML 配置:
[...]
<refresh-cache-policy/>
<caching-policy/>
[...]
生成的项目代码:
// ClassDescriptor Properties.
descriptor.useSoftCacheWeakIdentityMap();
descriptor.setIdentityMapSize(100);
descriptor.useRemoteSoftCacheWeakIdentityMap();
descriptor.setRemoteIdentityMapSize(100);
descriptor.setReadOnly();
descriptor.setAlias("SomeAlias");
// Cache Invalidation Policy
TimeToLiveCacheInvalidationPolicy policy = new TimeToLiveCacheInvalidationPolicy(1000);
policy.setShouldUpdateReadTimeOnUpdate(false);
descriptor.setCacheInvalidationPolicy(policy);
// Query Manager.
descriptor.getQueryManager().checkCacheForDoesExist();
【问题讨论】:
-
如果您将默认设置为使用共享缓存,则不确定您的意思是没有实体被缓存。您的代码必须通过一些定制器或运行时调用来更改缓存级别,因为这可以随时在项目或描述符级别完全配置。
-
仍然没有足够的信息。由于这是一个现有的应用程序,它是否总是打算使用缓存而您现在才意识到它不是,或者试图改变一些东西?你怎么确定它没有使用缓存,你是如何使用它的?如前所述,这些项目设置可以通过使用定制器和运行时调用在应用程序中随时更改,因此您需要通过应用程序本身找出可能无法按预期工作的原因。
-
我认为这是某种默认设置(所有实体似乎都具有此配置),并且以前不打算为这些实体缓存。现在,对于一些只读实体,我们希望启用缓存。我们注意到它不使用缓存,因为 db 中的更改会立即影响应用程序。
-
它不是,尽管 TimeToLiveCacheInvalidationPolicy(1000) 声明缓存中的对象在失效之前只有 1 秒的生存时间。失效会强制对该数据的下一个查询从数据库中重建它,这可能就是您所看到的。不过你没有展示具体的例子,所以我不能确定。
标签: java caching eclipselink