NHibernate的实现方案
在NHibernate上,缓存的机制实现充分考虑了性能与扩展性,它与Gentle.NET在实现不同的是全部是基于Hashtable而非HybridDictionary。一开始,我看见这样的实现的时候,还误以为,NHibenate过于模仿Java,而没有充分利用.NET的特性,然而,在仔细分析之后,发现直接使用Hashtable是一个非常好的思路。
因为在HybridDictionary中,当插入一个新的对象到集合中时,该类会进行一个判断,如果集合中的元素多于9个时,则切换为Hashtable模式,这看起来非常有意思。但实际上,在O/R Mapping中,集合的数量往往都是比较多的,尤其是在企业应用中,由于网络传输数据的延迟,缓存的实现是一个非常珍贵的资源,它大大的减轻了数据库服务端的压力。就这个层次上来说,实际上实现ListDictionary并没有太大的意义。
NHibernate的缓存机制,比起Gentle.NET来说,要复杂一些。NHibernate中,缓存对象的创建实际上通过CacheFactory产生的。这样做的原因是,在NHibernate中,缓存包括ReadOnlyCache、ReadWriteCache、NonstrictReadWriteCache这三种缓存管理类,它们都继承自ICacheConcurrencyStrategy接口,可以非常方便地添加应用了新策略的缓存管理类。
另外,在NHibernate中,缓存对象的类型也并不是不可变的,在现有的设计上,使用了HashtableCacheProvider与HashtableCache两个类来描述Provider对象和Cache对象,分别继承于ICacheProvider与ICache,如下代码所示:















































可以看出,这样的实现是一个非常优秀的设计,意味着非常强大的扩展性与可维护性。
在NHibernate的缓存方案中,使用了锁模式进行管理,它的实现是模仿操作系统中的“原语”进行的,是一个基于线程安全的实现的方案,具体的管理方式类似PV操作的形式。