我正在使用JCS来存储应该由多个EJB共享的ldap搜索结果。我创建了一个单例类来初始化JCS只有一次,但是由于EJB的类加载器,它已经用自己的副本多次初始化。所以不共享搜索资源。
你们如何解决需要在多个bean之间共享缓存的问题? 我在JVM中寻找缓存。 (不是遥控器,例如memcached等)。
Glassfish用作应用程序服务器。
答案 0 :(得分:2)
我还没有测试过,但我认为您正在使用的Glassfish版本的应用程序开发指南"Circumventing Class Loader Isolation" 章节中解释的技术之一可能会解决您的问题。< / p>
简短版本,至少对版本2-3-4有效:使用Common Classloader(这个常见的类加载器究竟是什么以及它与其他类加载器的关系在同一本手册中有解释)。有几种方法可以做到这一点:
asadmin add-library --type common /path/to/your.jar
(仅适用于版本4 iirc)这里有几个与“绕过类加载器隔离”相关的问题(只是使用该搜索术语),查看示例和更多讨论。
答案 1 :(得分:1)
简而言之,单例可能会“存活”您的缓存实现类所在的位置,因为这是“拥有”该类的层次结构中的类加载器。
因此,如果每个EJB都是单独部署的,并且拥有自己的缓存lib jar副本,那么每个EJB都会获得自己的副本。
如果您的bean部署在复合EAR中,共享一个lib jar实例,那么该缓存将在EAR中的bean之间共享。
如果从部署中完全删除lib,并将其放在容器外(例如$ DOMAIN / lib / ext),则该缓存将由域中的所有内容共享(EJB,EAR,WAR等)。 )。