设计一套基于NHibernate二级缓存的MongoDB组件(上)
2010-12-30 22:35
411 查看
摘要:NHibernate Contrib 支持很多第三方的二级缓存,如SysCache,MemCache,Prevalence等等,但是没有MongoDB的,于是自己扩展了一个支持MongoDB的缓存组件(NHibernate.Caches.MongoDBCache.dll)。本篇先把组件的源代码开放出来。
一、背景
在NHibernate的Contrib贡献项目官方网站(NHibernateContrib项目是由NHibernate开发团队或者终端用户根据需要自行编译并贡献的一系列的程序)中,拥有一个NHibernate.Caches的项目,里面包含汗多基于NHibernate二级缓存的组件,其中包括有:
NHibernate.Caches.MemCache:基于memcached分布式存储的缓存组件。这个大家都比较熟悉了就不多说了,详细可查阅相关信息。
NHibernate.Caches.Prevalence:基于Bamboo.Prevalence的缓存组件。它可产生一系列的缓存目录,通过缓存目录可以从文件中获取数据,并且在缓存目录中通过Snapshot,也就是快照,可以进行断点保存。详细介绍请看我的文章:(在Spring.Net中对于NHibernate.Caches.Prevalence的使用)
NHibernate.Caches.SharedCache:基于MergeSystem.Indexus.WinServiceCommon、MergeSystem.Indexus.WinService和MergeSystem.Indexus.Notify的分布式存储的缓存组件。用于在动态WEB或Win应用程序中减少数据库的负责,提高访问速度。
NHibernate.Caches.SysCache:我们通常DotNet上所使用的System.Web.Caching.Cache。
NHibernate.Caches.SysCache2:同上。不同的是增加了对于SQL2005的缓存依赖的支持。
NHibernate.Caches.Velocity:基于微软推出的分布式缓存Velocity组件。跟memcached一样,“Velocity”维护一张大的哈希表,这张表可以跨越多个服务器,你可以通过添加或者减少服务器来平衡系统压力。
二、什么是MongoDB?
MongoDB是一个基于分布式文档存储的数据库。旨在为WEB应用提供可护展的高性能数据存储解决方案。它是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。 它的特点是高性能、易部署、易使用,存储数据非常方便。
MongoDB官方服务端下载地址:http://www.mongodb.org/downloads
MongoDB官方客户端(.NET)下载地址:https://github.com/samus/mongodb-csharp
三、准备工作
服务器端下载下来后,首先要安装MongoDB,大家可以参考下这篇文章:/article/6068731.html
在你开发之前必须先吧MongoDB的服务或者控制台启动。这里我采用启动控制台。
代码
/// <summary>
/// 生成表格名称
/// </summary>
/// <param name="key"></param>
private void GenerateTableName(object key)
{
if (key is CacheKey)
{
CacheKey cacheKey = (CacheKey)key;
// 判断是否匹配正则表达式
if (Regex.IsMatch(cacheKey.EntityOrRoleName, _pattern))
{
_tableName = cacheKey.EntityOrRoleName.Replace(".", "_");
}
}
}
它是通过CacheKey的EntityOrRoleName属性,进行筛选,比如:这里的EntityOrRoleName为”“TestWebServer.Model.TblEnterprise”的字符串(这是一个NH自动生成的实体类),我给它的正则表达式为“^TestWebServer\.Model\..+?”,那么它匹配了,我就取它的这个字符串为表名称,最后的表名为:“TestWebServer_Model_TblEnterprise”。这样我缓存每一个实体,都能够自动创建相应的一个Mongo表。
5. 看下运行的结果:
测试代码如下:
[Test]
public void EnterpriseDaoTest6()
{
IEnterpriseDao dao = (IEnterpriseDao)applicationContext.GetObject("EnterpriseDao");
ITblEnterprise enterprise = dao.GetInfo(1);
…
}
第一次执行:
第一次的时候,执行了数据库的SELECT的SQL语句。
我查看本地目录以及用MongoVUE客户端工具查看了下Mongo数据库:
缓存数据已经存在目录(数据库)中。
第二次执行:
发现这里没有执行SQL。
说明MongoDB缓存成功。
6. 通过对对于NHibernate二级缓存机制的理解,我们完全可以扩展属于我们自己的缓存组件。不仅仅是作为MongoDB为载体的缓存实现。
因此,在下一篇文章中,我将重点介绍关于NHibernate二级缓存机制的原理,并且继续深入探讨MongoDB缓存组件的相关原理。
NHibernate.Caches.MongoDBCache.dll项目源代码下载:NHibernate.Caches.MongoDBCache.rar
一、背景
在NHibernate的Contrib贡献项目官方网站(NHibernateContrib项目是由NHibernate开发团队或者终端用户根据需要自行编译并贡献的一系列的程序)中,拥有一个NHibernate.Caches的项目,里面包含汗多基于NHibernate二级缓存的组件,其中包括有:
NHibernate.Caches.MemCache:基于memcached分布式存储的缓存组件。这个大家都比较熟悉了就不多说了,详细可查阅相关信息。
NHibernate.Caches.Prevalence:基于Bamboo.Prevalence的缓存组件。它可产生一系列的缓存目录,通过缓存目录可以从文件中获取数据,并且在缓存目录中通过Snapshot,也就是快照,可以进行断点保存。详细介绍请看我的文章:(在Spring.Net中对于NHibernate.Caches.Prevalence的使用)
NHibernate.Caches.SharedCache:基于MergeSystem.Indexus.WinServiceCommon、MergeSystem.Indexus.WinService和MergeSystem.Indexus.Notify的分布式存储的缓存组件。用于在动态WEB或Win应用程序中减少数据库的负责,提高访问速度。
NHibernate.Caches.SysCache:我们通常DotNet上所使用的System.Web.Caching.Cache。
NHibernate.Caches.SysCache2:同上。不同的是增加了对于SQL2005的缓存依赖的支持。
NHibernate.Caches.Velocity:基于微软推出的分布式缓存Velocity组件。跟memcached一样,“Velocity”维护一张大的哈希表,这张表可以跨越多个服务器,你可以通过添加或者减少服务器来平衡系统压力。
二、什么是MongoDB?
MongoDB是一个基于分布式文档存储的数据库。旨在为WEB应用提供可护展的高性能数据存储解决方案。它是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。 它的特点是高性能、易部署、易使用,存储数据非常方便。
MongoDB官方服务端下载地址:http://www.mongodb.org/downloads
MongoDB官方客户端(.NET)下载地址:https://github.com/samus/mongodb-csharp
三、准备工作
服务器端下载下来后,首先要安装MongoDB,大家可以参考下这篇文章:/article/6068731.html
在你开发之前必须先吧MongoDB的服务或者控制台启动。这里我采用启动控制台。
代码
/// <summary>
/// 生成表格名称
/// </summary>
/// <param name="key"></param>
private void GenerateTableName(object key)
{
if (key is CacheKey)
{
CacheKey cacheKey = (CacheKey)key;
// 判断是否匹配正则表达式
if (Regex.IsMatch(cacheKey.EntityOrRoleName, _pattern))
{
_tableName = cacheKey.EntityOrRoleName.Replace(".", "_");
}
}
}
它是通过CacheKey的EntityOrRoleName属性,进行筛选,比如:这里的EntityOrRoleName为”“TestWebServer.Model.TblEnterprise”的字符串(这是一个NH自动生成的实体类),我给它的正则表达式为“^TestWebServer\.Model\..+?”,那么它匹配了,我就取它的这个字符串为表名称,最后的表名为:“TestWebServer_Model_TblEnterprise”。这样我缓存每一个实体,都能够自动创建相应的一个Mongo表。
5. 看下运行的结果:
测试代码如下:
[Test]
public void EnterpriseDaoTest6()
{
IEnterpriseDao dao = (IEnterpriseDao)applicationContext.GetObject("EnterpriseDao");
ITblEnterprise enterprise = dao.GetInfo(1);
…
}
第一次执行:
第一次的时候,执行了数据库的SELECT的SQL语句。
我查看本地目录以及用MongoVUE客户端工具查看了下Mongo数据库:
缓存数据已经存在目录(数据库)中。
第二次执行:
发现这里没有执行SQL。
说明MongoDB缓存成功。
6. 通过对对于NHibernate二级缓存机制的理解,我们完全可以扩展属于我们自己的缓存组件。不仅仅是作为MongoDB为载体的缓存实现。
因此,在下一篇文章中,我将重点介绍关于NHibernate二级缓存机制的原理,并且继续深入探讨MongoDB缓存组件的相关原理。
NHibernate.Caches.MongoDBCache.dll项目源代码下载:NHibernate.Caches.MongoDBCache.rar
相关文章推荐
- 基于NHibernate二级缓存的MongoDB组件
- Spring.NET实用技巧1——基于Prevalence下的NHibernate二级缓存使用技巧
- mongodb底层存储和索引原理——本质是文档数据库,无表设计,同时wiredTiger存储引擎支持文档级别的锁,MMAPv1引擎基于mmap,二级索引(二级是文档的存储位置信息『文件id + 文件内offset 』)
- 提供类似于对象检查器的组件窗体设计器以及基于图表的控件LMD DesignPack
- unity3d笔记二:基于组件的设计
- 基于GridView LoadMoreAsync 设计的横向双向瀑布流 组件 源码分享
- 基于注解形式的hibernate二级缓存的使用(ehcache)
- 01-08-02【Nhibernate (版本3.3.1.4000) 出入江湖】二级缓存:NHibernate自带的HashtableProvider
- nhibernate性能之二级缓存篇
- 01-08-03【Nhibernate (版本3.3.1.4000) 出入江湖】二级缓存:NHibernate自带的HashtableProvider之缓存管理
- 基于 IOCP 的通用异步 Windows Socket TCP 高性能服务端组件的设计与实现
- 基于Tiles框架Struts框架的UI 设计—几种组织HTML和JSP视图组件
- 设计一套缓存框架需要关注的要素
- 如何使用基于组件的设计方法
- 《深入理解mybatis原理》 MyBatis的二级缓存的设计原理
- 基于Freemarker模板技术的分页组件设计
- 基于反向代理的Web缓存加速??可缓存的CMS系统设计
- [转]基于反向代理的Web缓存加速 ——可缓存的CMS系统设计
- 《深入理解mybatis原理(四)》 MyBatis的二级缓存的设计原理
- 基于mongodb, 设计游戏中的个人背包系统