SingletonEhCacheRegionFactory和EhCacheRegionFactory的区别

35

这个链接(来自Ehcache的创建者)建议在只有一个Hibernate SessionFactory时使用SingletonEhCacheRegionFactory,在有多个SessionFactory时使用EhCacheRegionFactory。

但是当你只有一个SessionFactory时,使用EhCacheRegionFactory难道不也是单实例吗?

那么,SingletonEhCacheRegionFactory有什么好处呢?既然EhCacheRegionFactory可以用于一个或多个SessionFactory,为什么不始终使用它呢?

FYI:我正在使用Ehcache 2.4.2和Hibernate 3.6.5。


1
“事实上的单例”这个词有点奇怪,如果不是说毫无意义。如果你的类保证最多只有一个实例,那么它就是一个单例;如果不是,则不是单例。如果在实践中,你最多只有一个实例,但你仍然可以创建额外的实例,无论它们有多么无用,那么它也不是单例。据我所知,您可以使用公共构造函数制作任意数量的EhCachRegionFactory实例,而不管您拥有多少个SessionFactory。也许我没有理解您问题的要点。如果是这样,请指出我错过了什么。 - Rinke
2
也许使用AbstractSingletonEhCacheRegionProxyBeanFactory可以解决这个问题? - GreenieMeanie
@GreenieMeanie 这不是问题,而是一个疑问。哪个更好? - Brad Cupit
1
@Rinke 我基本上在质疑为什么SingletonEhCacheRegionFactory存在。看起来EhCacheRegionFactory会达到同样的目的,只要你只配置/实例化一个实例。也许SingleonEhCacheRegionFactory更快,或者使用更少的内存等? - Brad Cupit
2个回答

10

非单例的EhCacheRegionFactory允许您使用net.sf.ehcache.configurationResourceName 属性为每个Hibernate实例单独配置EHCache。而SingletonEhCacheRegionFactory则在所有Hibernate会话工厂之间共享相同的EHCache配置。

EHCache文档建议使用非单例版本。

编辑:此信息适用于EHCache 2.8版。不确定最新版本有多少更改。


2
谢谢提供链接。链接中提到当您有多个缓存时使用非单例版本,但原始问题链接到一个错误,该错误说“最好使用SingletonEhCacheProvider”。我只是不明白为什么。 - Brad Cupit
1
@BradCupit,我终于注意到了你提供的Hibernate JIRA链接。你可能应该直接给报告者发一封电子邮件,询问为什么它更受欢迎。我已经快速查看了评论以及附加的源代码,但是在我能够投入的时间内,我还没有能够得出结论。 - Matej
@BradCupit,你有机会在邮件列表上询问为什么不推荐使用单例模式吗? - Bence Olah
@BenceOlah 我还没有问过。如果你正在考虑这样做,请告诉我他们说了什么! - Brad Cupit
1
@palacsint 请查看 http://www.ehcache.org/documentation/2.8/integrations/hibernate#optional 。这与v2.8有关。在v2.10中,事情似乎有些变化。我已经有一段时间没有使用EHCache了,你可能需要重新查看当前文档以找到适合你的适当方法。 - Matej
1
@palacsint 修复了链接。 - Brad Cupit

0

我猜想使用SingletonEhCacheRegionFactory,您不需要维护(或确保)EhCacheRegionFactory是单例的。您可以在任何地方创建new SingletonEhCacheRegionFactory(),它仍将在整个应用程序中作为单例。

而对于EhCacheRegionFactory,您需要显式地配置对象的范围,以确保它是单例的。


使用Hibernate时,类名会列在一个XML文件中,因此您无法控制它是否为单例。 - Brad Cupit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接