在实现EJBHomeFactory模式时是否需要同步Map?

时间:2009-08-26 07:48:55

标签: design-patterns ejb jndi

如果要从客户端调用EJBBean,首先需要通过JNDI查找获取EJBHome对象引用。每次需要使用EJBBean时都需要执行此代码,因此需要多余且昂贵。

要解决此问题,您可以缓存EJBHome对象引用,并在不重复JNDI查找的情况下从缓存中重复使用它们。

这是EJBHomeFactory Pattern(或更通用的服务定位器模式)。

我见过的大多数实现使用同步Map作为缓存,或Hashtable。如果在服务器上部署应用程序时构造了缓存,并且之后没有对缓存进行任何修改(仅执行get()方法)我是否真的需要同步MapHashMap将办?

我知道HashMap如果至少有一个线程修改了地图(在here上甚至有一个SO帖子),则不安全,但在这种情况下,线程只执行读取。

那么,在HashMap中使用EJBHomeFactory Pattern安全吗?

1 个答案:

答案 0 :(得分:0)

如果你可以保证生命周期与你描述的一样,那么很明显,未同步的HashMap应该没问题。但是,我的直觉是,这种构建方式与您当前的部署模式有着脆弱的关系。

如果您使用同步数据结构,那么知道它现在和将来都是安全的。除非你有具体证据证明同步真正影响了性能,否则我会采用“明显正确”的实现方式。

顺便说一下,几个领先的应用程序服务器实际上缓存了JNDI查找的结果,所以不清楚你使用实际给出的模式有多少 - 虽然我必须承认我倾向于自己使用它。

EJB引用本身可以重用,因此实际上去家的频率可以保持很低。如果目标是极端表现,这可能是探索的另一条途径。