NHibernate 应该清除 ISessionFactory.Dispose 上的分布式二级缓存吗?

The*_*Sky 5 .net c# nhibernate

我工作的CacheProvider对Redis的。我偶然发现了一些对预先构建的NHibernate Cache Providers非常好奇的东西。

在分布式环境中,我希望每个 Web 服务器共享相同的 NHibernate 缓存。因此,如果其中一个 Web 服务器被移除,缓存也不会受到影响(因为集群中的另一个Web 服务器仍将使用该缓存!)。

但是,根据我的测试和这些提供程序的来源,每次ISessionFactory关闭(调用DisposeClose)时,都会清除整个缓存区域

例如,Memcached Provider调用Clear()whenDestroy()被调用。在Close()ISessionFactory,每个创建ICacheDestroy()调用,然后最后ICacheProviderStop()呼吁。因此,尽管 Memcached 旨在成为分布式缓存,但在ISessionFactory处理它时它会被清除!

真的是分布式环境中的预期行为吗?每次关闭 Web 服务器时清除分布式缓存似乎会产生大量缓存未命中,从而失去缓存的全部意义!

我在想的是,Destroy()应该使用它来清理任何资源(例如Dispose()……但它是从 Hibernate 中带来的)并且这些缓存提供程序有一个严重的错误。例如,Hibernate的Memcached的缓存provdier我发现 clear()destroy()

FWIW,我已将其发布在 NHibernate 开发组上。

小智 5

你是对的。分布式缓存不应该像这样,因为它违背了目的。当Destroy()被调用时,被称为在供应商的功能应该是Dispose()。此功能仅断开缓存而不清除缓存,因此其他客户端的数据在分布式缓存中保持完整。