NHibernate使用MemCache二级缓存

首先,当然是安装MemCache服务器端了。

  然后配置过程,仅仅两个问题。

  1、NHibernate要与NHibernate.Cache的版本要一致。否则,NHibernate.Caches.MemCache.MemCacheProvider无法实例化。

  2、要引用log4net,否则Memcached.ClientLibrary.SockIOPool无法实例化。

  App.config:

<?xml version="1.0"?>
<configuration>
  <configSections>
    <!--配置自定义memcache节点-->
    <section name="memcache" type="NHibernate.Caches.MemCache.MemCacheSectionHandler,NHibernate.Caches.MemCache"/>
    <section name="hibernate-configuration" type="NHibernate.Cfg.ConfigurationSectionHandler, NHibernate"/>
  </configSections>
  <memcache>
    <memcached host="127.0.0.1" port="11211" weight="2"/>
  </memcache>
  <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
    <session-factory>
      <property name="dialect">NHibernate.Dialect.MsSql2008Dialect</property>
      <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
      <property name="show_sql">true</property>
      <property name="connection.connection_string">Server=KISSDODOG-PC;initial catalog=Test;uid=sa;pwd=123;</property>
      <!--配置二级缓存-->
      <property name="cache.provider_class">NHibernate.Caches.MemCache.MemCacheProvider,NHibernate.Caches.MemCache</property>
      <!--<property name="cache.provider_class">NHibernate.Cache.HashtableCacheProvider</property>-->
      <property name="cache.use_second_level_cache">true</property>
      <property name="cache.use_query_cache">true</property>
      <property name="cache.default_expiration">300</property>
      <property name="cache.region_prefix">prefix</property>
      <mapping assembly="Model"/>
      <!-- 配置映射的二级缓存 -->
      <class-cache class="Model.PersonModel,Model" usage="read-write"/>
    </session-factory>
  </hibernate-configuration>
  <startup>
    <supportedRuntime version="v2.0.50727"/>
  </startup>
</configuration>

  Person.hbm.xml

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <class name="Model.PersonModel, Model" table="Person">
    <cache usage="read-write"/>
    <id name="PersonId" column="PersonId" type="Int32">
      <generator  class="native"/>
    </id>
    <property name="PersonName" column="PersonName" type="String"/>
    <!--多对一关系:Person属于一个Country name是Person实体类里的-->
    <many-to-one name="Country" column="CountryId" not-null="true" class="Model.CountryModel,Model" foreign-key="FK_Person_Country" />
    <!-- 一个Country里面有多个Person -->
    <set name="ListChild" table="Child" generic="true">
      <key column="ParentId" foreign-key="FK_Child_Person"/>
      <one-to-many class="Model.ChildModel,Model"/>
    </set>
  </class>
</hibernate-mapping>

  引用如下3个dll:

  

    class Program
    {
        static void Main(string[] args)
        {
            Memcached.ClientLibrary.SockIOPool pool = Memcached.ClientLibrary.SockIOPool.GetInstance();
            ISessionFactory sessionFactory = new Configuration().Configure().BuildSessionFactory();
            using (ISession session = sessionFactory.OpenSession())
            {
                PersonModel p = session.Get<PersonModel>(1);
                Console.WriteLine(p.PersonId + " : " + p.PersonName);
            }

            using (ISession session = sessionFactory.OpenSession())
            {
                PersonModel p = session.Get<PersonModel>(1);
                Console.WriteLine(p.PersonId + " : " + p.PersonName);
            }
            Console.ReadKey();
        }
    }

  输出如下:

  

  从结果可以看到,只有第一次查询执行了SQL语句。

  现在停止调试,再次启动调试:

  

  神奇的是,这次两次都没有执行SQL语句。这是因为MemCached是以服务的形式运行在操作系统中,与你的程序是独立的。

  PS:NHibernate的第三方插件,严重跟不上NHibernate的速度。为了使用NHibernate.Cache第三方插件配合 MemCache。不能使用最新版的NHibernate了。看来这个东西的作用还不是那么大。看来,还得学一下MemCache自己实现。

时间: 2024-10-26 17:40:55

NHibernate使用MemCache二级缓存的相关文章

[Nhibernate]二级缓存(一)

目录 写在前面 文档与系列文章 二级缓存 Nhibernate二级缓存提供程序 一个例子 总结 写在前面 上篇文章介绍了nhibernate中一级缓存的相关内容,一级缓存过期时间和ISession对象的生命周期相同,并且不同的Session不能共享缓存,一级缓存也可以成为ISession缓存.那么现在我们就学一下nhibernate中的二级缓存,即ISessionFactory级别缓存,可被所有的ISession所共享.二级缓存是可扩展的,在http://sourceforge.net/proj

ListView异步记载图片+解决图片错位的问题解决+使用二级缓存(LruCache+DiskLruCache)

这个demo演示了下面的功能: 1.解决了ListView加载图片错位的问题.(给ImageView设置一个tag,并预设一个图片) 2.异步加载图片 3.二级缓存(内存,文件二级缓存) 实现的效果: AsyncImageLoader类: package com.dystu.ustc.asyncimageload; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.Fil

01-08-05【Nhibernate (版本3.3.1.4000) 出入江湖】NHibernate二级缓存:第三方MemCache缓存

一.准备工作 [1]根据操作系统(位数)选择下载相应版本的MemCache, MemCache的下载和安装,参看: http://www.cnblogs.com/easy5weikai/p/3760677.html [2]第三方MemCache缓存适配器,下载地址: http://sourceforge.net/projects/nhcontrib/files/ 特别说明: 1.一定要版本一致 MemCache缓存适配器写本文的时候最高版本是:NHCH-3.2.0.GA-bin(不支持高版本的N

NHibernate第三方二级缓存bug

在下第一次使用NHibernate,看中了它的二级缓存,不过发现不开启缓存的话,数据是正常的,一旦开启就发现获取了很多重复数据,我试了NHibernate.Caches.MemCache和NHibernate.Caches.EnyimMemcached这两个缓存实现,发现bug是一样的,而使用NHibernate自带的NHibernate.Cache.HashtableCacheProvider缓存实现发现是正常的,所以我猜测是生成的key重复了的问题,因为memcache(我用windows版

01-08-03【Nhibernate (版本3.3.1.4000) 出入江湖】二级缓存:NHibernate自带的HashtableProvider之缓存管理

http://www.cnblogs.com/lyj/archive/2008/11/28/1343418.html 管理NHibernate二级缓存 NHibernate二级缓存由ISessionFactory创建并由ISessionFactory自行维护.我们使用NHibernate操作数据时,ISessionFactory能够自动同步缓存,保证缓存的有效性.但是当我们批量操作数据时,往往NHibernate不能维护缓存持久有效.ISessionFactory提供了可编程方式的缓存管理方法.

探索ASP.NET MVC5系列之~~~5.缓存篇(页面缓存+二级缓存)

其实任何资料里面的任何知识点都无所谓,都是不重要的,重要的是学习方法,自行摸索的过程(不妥之处欢迎指正) 汇总:http://www.cnblogs.com/dunitian/p/4822808.html#mvc 本章Demo:https://github.com/dunitian/LoTCodeBase/blob/master/NetCode/6.网页基础/BMVC5/MVC5Base/Controllers/CacheController.cs 这次来篇放松的,咱们不要老是说安全相关的东西.

二级缓存

Memcache的特点: 分布式内存对象缓存系统,占用其他机子的内存.很多互联网,负载均衡三台(以三台为例)web服务器可以共享一台Memcache的资源.传递的信息以键值对的形式存储.传递的数据要实现序列化. Oscache的特点: 页面级缓存,占用本机的内存资源.可以选择缓存到硬盘,如存取到硬盘重启服务也可重新获得上次持久化的资源,而如果缓存到内存就不行.一般没必要缓存到硬盘,因为I/O操作也是比较耗资源,和从数据库取往往优势很小.Oscache存取数据的作用域分为application和s

mybatis结合redis实战二级缓存(六)

之前的文章中我们意见分析了一级缓存.二级缓存的相关源码和基本原理,今天我们来分享下了mybatis二级缓存和redis的结合,当然mybatis二级缓存也可以和ehcache.memcache.OSCache.Hazelcast结合使用.二级缓存相关的源码分享请参考<Mybatis源码分析之Cache二级缓存原理>.我们通过两种方式来实战,一种是自己编写缓存.另外一种是官方给出的demo地址:http://www.mybatis.org/redis-cache/ 一:自定义mybatis缓存

NHibernate教程(19) —— 一级缓存

本节内容 引入 NHibernate一级缓存介绍 NHibernate一级缓存管理 结语 引入 大家看看上一篇了吗?对象状态.这很容易延伸到NHibernate的缓存.在项目中我们灵活的使用NHibernate的缓存机制.NHibernate性能会大大提高的哦,我们接下来就来探索NHibernate缓存机制吧,这篇我没有准备什么,先来学习下NHibernate一级缓存. NHibernate一级缓存介绍 NHibernate一级缓存即ISession缓存,ISession缓存属于事务级缓存,是N