我正在使用 JCS 存储应该由多个 EJB 共享的 ldap 搜索结果。我创建了一个单例类来仅初始化 JCS 一次,但由于 EJB 的类加载器,它已使用自己的副本多次初始化。所以搜索资源不共享。
你们如何解决需要跨多个 bean 共享缓存的问题?我正在寻找 JVM 中的缓存。(不是远程的,例如 memcached 等)。
Glassfish 用作应用程序服务器。
我正在使用 JCS 存储应该由多个 EJB 共享的 ldap 搜索结果。我创建了一个单例类来仅初始化 JCS 一次,但由于 EJB 的类加载器,它已使用自己的副本多次初始化。所以搜索资源不共享。
你们如何解决需要跨多个 bean 共享缓存的问题?我正在寻找 JVM 中的缓存。(不是远程的,例如 memcached 等)。
Glassfish 用作应用程序服务器。
我还无法对其进行测试,但我认为您正在使用的 Glassfish 版本的应用程序开发指南的“规避类加载器隔离”一章中解释的技术之一可能会解决您的问题。
短版,至少对版本 2-3-4 有效:使用通用类加载器(这个通用类加载器的作用及其与其他类加载器的关系在同一手册中进行了说明)。做这件事有很多种方法:
asadmin add-library --type common /path/to/your.jar
(仅适用于版本 4 iirc)这里有几个关于“规避类加载器隔离”的问题(只需使用该搜索词),请在此处查看示例和更多讨论。
简而言之,单例可能会“存在”在您的缓存实现类所在的位置,因为这是“拥有”该类的层次结构中的类加载器。
因此,如果每个 EJB 都单独部署,并使用自己的缓存库 jar 副本,它们将各自获得自己的副本。
如果您的 bean 部署在复合 EAR 中,共享 lib jar 的单个实例,那么该缓存将在 EAR 中的 bean 之间共享。
如果您从部署中完全删除 lib,并将其放在容器外部(例如 $DOMAIN/lib/ext),那么该缓存将由域中的所有内容(EJB、EAR、WAR 等)共享。