0

当您想从客户端调用 an时,首先您需要通过 JNDI 查找EJBBean来获取对象引用。EJBHome每次您需要使用此代码时都需要执行此代码,EJBBean这样会变得多余且昂贵。

要解决此问题,您可以缓存EJBHome对象引用并从缓存中一次又一次地重用它们,而无需重复 JNDI 查找。

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

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

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

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

4

1 回答 1

0

如果您可以保证生命周期如您所描述的那样,那么未同步的 HashMap 似乎应该没问题。但是,我的直觉是,这对您当前的部署模式建立了脆弱的依赖关系。

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

顺便说一句,几个领先的应用程序服务器实际上缓存了 JNDI 查找的结果,所以不清楚你使用的模式实际节省了多少——尽管我必须承认我自己确实倾向于使用它。

EJB 引用本身是可以重用的,所以实际上回家的频率可以保持很低。如果极端性能是目标,这可能是进一步探索的途径。

于 2009-08-26T08:07:30.293 回答