控制台体验实现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;-->
配置创建工厂与memcache所需配置

第四步:在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

 

 

 

 

 

 

 

 

 

 

 

 

posted on 2016-01-12 15:18  高达  阅读(1592)  评论(0)    收藏  举报

导航