Caching 如何跨多个EJB共享Java缓存系统(JCS)资源

Caching 如何跨多个EJB共享Java缓存系统(JCS)资源,caching,singleton,glassfish,classloader,jcs,Caching,Singleton,Glassfish,Classloader,Jcs,我使用JCS存储ldap搜索结果,这些结果应该由多个EJB共享。我创建了一个singleton类,只初始化JCS一次,但由于EJB的classloader,它已经用自己的副本初始化了多次。因此,搜索资源是不共享的 你们如何解决需要跨多个bean共享缓存的问题? 我正在JVM中寻找缓存。(不是远程设备,例如memcached等) Glassfish被用作应用服务器。我还无法测试它,但我认为您正在使用的Glassfish版本的应用程序开发指南一章中介绍的技术之一可能会解决您的问题 简短版本,至少对

我使用JCS存储ldap搜索结果,这些结果应该由多个EJB共享。我创建了一个singleton类,只初始化JCS一次,但由于EJB的classloader,它已经用自己的副本初始化了多次。因此,搜索资源是不共享的

你们如何解决需要跨多个bean共享缓存的问题? 我正在JVM中寻找缓存。(不是远程设备,例如memcached等)


Glassfish被用作应用服务器。

我还无法测试它,但我认为您正在使用的Glassfish版本的应用程序开发指南一章中介绍的技术之一可能会解决您的问题


简短版本,至少对版本2-3-4有效:使用通用类加载器(该通用类加载器的具体功能及其与其他类加载器的关系在同一手册中进行了解释)。有几种方法可以做到这一点:

  • 将jar复制到domain dir/lib
  • 或者将jar复制到install/lib
  • 或者运行asadmin add library--type common/path/to/your.jar(仅适用于版本4 iirc)

这里有几个问题与“规避类装入器隔离”(仅使用该搜索词)有关,请查看示例和更多讨论。

简单地说,单例很可能“存在”缓存实现类所在的位置,因为它是层次结构中“拥有”类的类装入器

因此,如果每个EJB都是单独部署的,并且都有自己的缓存库jar副本,那么每个EJB都会有自己的副本

如果您的bean部署在复合EAR中,共享lib-jar的单个实例,那么该缓存将在EAR中的bean之间共享


如果您完全从部署中删除lib,并将其放在容器外($DOMAIN/lib/ext),那么该缓存将由域中的所有内容(EJB、EAR、WAR等)共享。

您能告诉我们更多有关EJB打包和类加载器问题的信息吗?谢谢您的回答。JCS缓存是公共库的一部分,它跨多个EJB和绑定组件(OpenESB)共享,但我想$DOMAIN/lib应该可以解决这些问题。