如果要从客户端调用EJBBean
,首先需要通过JNDI查找获取EJBHome
对象引用。每次需要使用EJBBean
时都需要执行此代码,因此需要多余且昂贵。
要解决此问题,您可以缓存EJBHome
对象引用,并在不重复JNDI查找的情况下从缓存中重复使用它们。
这是EJBHomeFactory Pattern
(或更通用的服务定位器模式)。
我见过的大多数实现使用同步Map
作为缓存,或Hashtable
。如果在服务器上部署应用程序时构造了缓存,并且之后没有对缓存进行任何修改(仅执行get()方法)我是否真的需要同步Map
或HashMap
将办?
我知道HashMap
如果至少有一个线程修改了地图(在here上甚至有一个SO帖子),则不安全,但在这种情况下,线程只执行读取。
那么,在HashMap
中使用EJBHomeFactory Pattern
安全吗?
答案 0 :(得分:0)
如果你可以保证生命周期与你描述的一样,那么很明显,未同步的HashMap应该没问题。但是,我的直觉是,这种构建方式与您当前的部署模式有着脆弱的关系。
如果您使用同步数据结构,那么知道它现在和将来都是安全的。除非你有具体证据证明同步真正影响了性能,否则我会采用“明显正确”的实现方式。
顺便说一下,几个领先的应用程序服务器实际上缓存了JNDI查找的结果,所以不清楚你使用实际给出的模式有多少 - 虽然我必须承认我倾向于自己使用它。
EJB引用本身可以重用,因此实际上去家的频率可以保持很低。如果目标是极端表现,这可能是探索的另一条途径。