控制台体验实现memcache 二级缓存的步骤 下载地址 http://pan.baidu.com/s/1skga4Ol
准备:
1、配置memcache服务 :一、Windows下安装Memcache(具体可以参考视频)
2、准备6个程序集:

要引用log4net,否则Memcached.ClientLibrary.SockIOPool无法实例化。
没有引用ICSharpCode.SharpZipLib报错
could not load an entity: [NH02.Domain.EmployeeInfo#1][SQL: SELECT employeein0_.Emp_No as Emp1_0_0_, employeein0_.Emp_Name as Emp2_0_0_, employeein0_.Salary as Salary0_0_, employeein0_.Dept_Name as Dept4_0_0_, employeein0_.Designation as Designat5_0_0_ FROM EmployeeInfo employeein0_ WHERE employeein0_.Emp_No=?]
开始:
第一步:
创建一个控制台程序并命名为NH02 ,同时引入前台提到的NHibernate.dll 、NHibernate.Caches.MemCache.dll Iesi.Collections.dll ICSharpCode.SharpZipLib.dll log4net.net 5个程序集

第二步:配置创建工厂所需的外部配置文件.....hbm.xml与实体类....cs
映射文件:注意(映射文件属性:生成操作:设置为:嵌入的资源)
1 <?xml version="1.0" encoding="utf-8"?> 2 <hibernate-mapping assembly="NH02" namespace="NH02.Domain" xmlns="urn:nhibernate-mapping-2.2"> 3 <!--<hibernate-mapping assembly="{程序集名称}" namespace="{命名空间}" xmlns="urn:nhibernate-mapping-2.2">--> 4 <class name="EmployeeInfo" table="EmployeeInfo" lazy="true" > 5 <cache usage="read-write"/> 6 <!--<class name="{类名}" table="{数据库表名}" lazy="{是否延迟加载true/false}" >--> 7 <id name="EmpNo" column="Emp_No"> 8 <!--<id name="{类属性名字}" column="{数据为表属性名}">--> 9 <generator class="identity" /> 10 <!--<generator class="identity" /> identity:用于MySql数据库。特点:递增--> 11 </id> 12 <property name="EmpName"> 13 <column name="Emp_Name" sql-type="varchar" not-null="true" /> 14 </property> 15 <!--<property name="{类属性名}"> 16 <column name="{数据为表属性名称}" sql-type="{类型:如:decimal、varchar...}" not-null="{是否可以为NULL:true/false}" /> 17 </property>--> 18 <property name="Salary"> 19 <column name="Salary" sql-type="decimal" not-null="true" /> 20 </property> 21 <property name="DeptName"> 22 <column name="Dept_Name" sql-type="varchar" not-null="true" /> 23 </property> 24 <property name="Designation"> 25 <column name="Designation" sql-type="varchar" not-null="true" /> 26 </property> 27 </class> 28 </hibernate-mapping>
实体类:
1 using System; 2 using System.Text; 3 using System.Collections.Generic; 4 namespace NH02.Domain 5 { 6 public class EmployeeInfo 7 { 8 public virtual int EmpNo { get; set; } 9 public virtual string EmpName { get; set; } 10 public virtual decimal Salary { get; set; } 11 public virtual string DeptName { get; set; } 12 public virtual string Designation { get; set; } 13 } 14 }

第三步:配置创建工厂与memcache 所需配置 映射文件:注意(映射文件属性:生成操作:设置为:嵌入的资源)
1 <?xml version="1.0" encoding="utf-8" ?> 2 <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2"> 3 <session-factory> 4 <property name="connection.provider"> 5 NHibernate.Connection.DriverConnectionProvider 6 </property> 7 <property name="dialect">NHibernate.Dialect.MsSql2008Dialect</property> 8 <property name="connection.driver_class"> 9 NHibernate.Driver.SqlClientDriver 10 </property> 11 <property name="show_sql">true</property> 12 <property name="connection.connection_string">server=127.0.0.1;database=Company;uid=sa;pwd=123;</property> 13 14 15 <!--配置二级缓存--> 16 17 <property name="cache.provider_class">NHibernate.Caches.MemCache.MemCacheProvider,NHibernate.Caches.MemCache</property> 18 <!--<property name="cache.provider_class">NHibernate.Cache.HashtableCacheProvider</property>--> 19 <!--3.--> 20 <property name="cache.use_second_level_cache">true</property> 21 <property name="cache.use_query_cache">true</property> 22 <property name="cache.default_expiration">300</property> 23 <property name="cache.default_expiration">300</property> 24 <mapping assembly="NH02"/> 25 <!--3.配置映射的二级缓存--> 26 <class-cache class="NH02.Domain.EmployeeInfo,NH02" usage="read-write"/> 27 28 29 30 </session-factory> 31 </hibernate-configuration> 32 33 34 35 <!--下面对几个重要的key值说明一下: 36 hibernate.connection.provider 37 连接提供者,取值必须是实现了IConnectionProvider接口的类的全名,当前版本只能取值NHibernate.Connection.DriverConnectionProvider; 38 hibernate.connection.driver_class 39 数据驱动类,取值必须是实现了IDriver接口的类的全名,常用的选择有NHibernate.Driver.SqlClientDriver, NHibernate.Driver.OleDbDriver等; 40 hibernate.dialect 41 数据库方言,取值必须是继承之Dialect的类的全名,最常用的就是NHibernate.Dialect.MsSql2000Dialect/NHibernate.Dialect.MsSql2008Dialect了, 其它的没用过,不清楚能不能正常使用; 42 hibernate.connection.connection_string 43 连接字符串(如:server=127.0.0.1;database=Company;uid=sa;pwd=123;),取值与driver_class对应即可; 44 hibernate.show_sql 45 指明是否在log4net日志中显示sql语句,主要用于调试,取值为true或false;-->

第四步:在App.config配置memcache 节点与端口 (如没有配置会报错:)

配置文件:
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <!-- 1.0 配置memcache节点--> <section name="memcache" type="NHibernate.Caches.MemCache.MemCacheSectionHandler,NHibernate.Caches.MemCache"/> </configSections> <!-- 2.0 配置memcache端口节点--> <memcache> <memcached host="127.0.0.1" port="11211" weight="2"/> <!--<memcached host="{主机}" port="{端口}" weight="{权重}"/>--> </memcache> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> </startup> </configuration>
第5步:创建工厂并调试:
创建工厂:
static ISessionFactory CreateISessionFactoryByXml() { Configuration cfg = new Configuration().Configure(@"E:\NH2015\02\NH02\NH02\NHibernate\Configuration\hibernate.cfg.xml"); //读取xml文件 ISessionFactory sessionFactory = cfg.BuildSessionFactory(); //创建工厂 return sessionFactory; }
通过工厂创建 SESSION就可以操作数据库了
public static void TextSecondCache() { ISessionFactory sessionFactory = CreateISessionFactoryByXml(); Console.WriteLine("第一个session开始"); using (ISession session = sessionFactory.OpenSession()) { EmployeeInfo a = session.Get<EmployeeInfo>(1); Console.WriteLine("a " + a.EmpName); } Console.WriteLine("第一个session结束 第2个session开始"); using (ISession session = sessionFactory.OpenSession()) { EmployeeInfo a = session.Get<EmployeeInfo>(1); Console.WriteLine("a " + a.EmpName); } }
调用
static void Main(string[] args) { TextSecondCache(); }
全部代码:
1 using NH02.Domain; 2 using NHibernate; 3 using NHibernate.Cfg; 4 using System; 5 using System.Collections.Generic; 6 using System.Linq; 7 using System.Text; 8 using System.Threading.Tasks; 9 10 namespace NH02 11 { 12 class Program 13 { 14 static void Main(string[] args) 15 { 16 17 TextSecondCache(); 18 } 19 20 21 static ISessionFactory CreateISessionFactoryByXml() 22 { 23 Configuration cfg = new Configuration().Configure(@"E:\NH2015\02\NH02\NH02\NHibernate\Configuration\hibernate.cfg.xml"); //读取xml文件 24 ISessionFactory sessionFactory = cfg.BuildSessionFactory(); //创建工厂 25 return sessionFactory; 26 } 27 28 public static void TextSecondCache() 29 { 30 ISessionFactory sessionFactory = CreateISessionFactoryByXml(); 31 Console.WriteLine("第一个session开始"); 32 using (ISession session = sessionFactory.OpenSession()) 33 { 34 EmployeeInfo a = session.Get<EmployeeInfo>(1); 35 Console.WriteLine("a " + a.EmpName); 36 37 } 38 Console.WriteLine("第一个session结束 第2个session开始"); 39 using (ISession session = sessionFactory.OpenSession()) 40 { 41 EmployeeInfo a = session.Get<EmployeeInfo>(1); 42 Console.WriteLine("a " + a.EmpName); 43 } 44 45 } 46 } 47 }
测试:
测试1:没有开启memcache
方式1: 在memcache服务关闭

方式2:在配置参数中设置关闭二级缓存: <property name="cache.use_second_level_cache">false</property>
运行效果

分别执行了二次SQL操作(则二次都是从数据为中获取数据源)
测试2:开启memcache服务并开启二级缓存策略 <property name="cache.use_second_level_cache">true</property>

<property name="cache.use_second_level_cache">true</property>
第一次运行效果(只执行了第一次查询,第二次查询由memcache 二级缓存获取数据(没有查询数据库存))

第二次运行效果:(关才程序后重启程序第二次运行效果)

查询数库存次数为0(说明是从memcache 缓存中取数据),虽然程序关闭了,但二级缓存仍然存在,说明memcache 二级缓存与程序是相互独立的,程序的关闭并不影响memcache 缓存销毁
最后睇下过了300S后效果如何: 二级缓存的有效时间(则过了300S后自动清除缓存) <property name="cache.default_expiration">300</property>

因为300S后 ,memcache 自己清除二级缓存,故第一次仍然从读取数据库
数据库表
USE [Company] GO /****** Object: Table [dbo].[EmployeeInfo] Script Date: 01/12/2016 16:04:45 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_PADDING ON GO CREATE TABLE [dbo].[EmployeeInfo]( [Emp_No] [int] IDENTITY(1,1) NOT NULL, [Emp_Name] [varchar](50) NOT NULL, [Salary] [decimal](18, 0) NOT NULL, [Dept_Name] [varchar](50) NOT NULL, [Designation] [varchar](50) NOT NULL, CONSTRAINT [PK_EmployeeInfo] PRIMARY KEY CLUSTERED ( [Emp_No] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO SET ANSI_PADDING OFF GO
浙公网安备 33010602011771号