我有一位客户陷入 EJB 3.0 环境中。没有@Singleton,没有bean管理的并发:-(
考虑到ejb规范禁止线程管理和同步,如何实现缓存?本质上,我想要一个非同步对象缓存来执行一些昂贵的操作。
EJB 3.0 规范第 21.1.2 章中规定了使用静态字段和同步的限制。它还解释了原因。
• 企业 Bean 不得使用读/写静态字段。使用
允许只读静态字段。因此,建议
企业 bean 类中的所有静态字段均声明为 Final。
需要此规则来确保一致的运行时语义,因为
而某些 EJB 容器可能使用单个 JVM 来执行所有 EJB 容器
enterprise bean的实例,其他人可以分发实例
跨多个 JVM。
• 企业 Bean 不得使用线程
同步原语用于同步多个执行
实例。
这与上面的原因相同。同步不起作用
如果 EJB 容器将企业 Bean 的实例分布在
多个 JVM。
如果您通过单例 POJO 实现缓存,并且 EJB 容器将 EJB 实例分布在多个 JVM 上(例如在集群环境中),那么您可能会面临每个 JVM 中实际上存在多个缓存实例的风险。
所以这取决于,
- 如果应用程序未部署在集群环境中,您可以这样做。据我所知,WebLogic 和 GlassFish 在一个 JVM 中运行一个服务器实例。
- 如果不限制数据一致性,您也可以这样做。通常在谈论“缓存”时是允许的。
如果它不适合您,您可能应该考虑在 EJB 容器之外缓存数据,例如放入 Redis 或 Hazelcast。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)