NHibernate二级缓存不与HashTableCacheProvider一起使用

NHibernate二级缓存不与HashTableCacheProvider一起使用,nhibernate,caching,Nhibernate,Caching,我基本上只是想重现Ayende的第一级和第二级缓存 我已将配置连接为: <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2"> <session-factory name="NHibernate.Test"> <property name="connection.driver_class">NHibernate.Driver.OracleDataClientDriver<

我基本上只是想重现Ayende的第一级和第二级缓存

我已将配置连接为:

<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
  <session-factory name="NHibernate.Test">
  <property name="connection.driver_class">NHibernate.Driver.OracleDataClientDriver</property>
  <property name="dialect">NHibernate.Dialect.Oracle10gDialect</property>
  <property name="show_sql">true</property>
  <property name="query.substitutions">true 1, false 0, yes 'Y', no 'N'</property>
  <property name="cache.use_query_cache">true</property>
  <property name="cache.use_second_level_cache">true</property>
  <property name="cache.provider_class">NHibernate.Cache.HashtableCacheProvider</property>
  <property name="cache.default_expiration">1801</property>
</session-factory>

NHibernate.Driver.OracleDataClientDriver
NHibernate.方言
真的
真1,假0,是“Y”,否“N”
真的
真的
NHibernate.Cache.HashtableCacheProvider
1801

我将实体映射为:

<class name="HeaderDTO" mutable="false" check="none">
<cache usage="read-write"/>
  <id name="Id" type="System.Int32" >
    <column name="id" sql-type="NUMBER" not-null="true" unique="true"/>
    <generator class="assigned"/>
  </id>
  <property name="Description" column="description" type="System.String" />
</class>

我的命名查询如下所示:

<sql-query name="GetHeaderDTO">
  <query-param name="id" type="int"/>
  <return class="HeaderDTO" />
  { call MyPackage.get_header(:id) }
</sql-query>

{调用MyPackage.get_头(:id)}
现在我正在尝试做一些测试(忽略这个事实,这个测试对于测试缓存不是一个很好的测试)

[TestMethod]
公共无效Cacching_Entity_firstcalliscacching()
{
日期时间开始时间;
日期时间结束时间;
时间跨度第一次尝试;
时间跨度第二次尝试;
int Id=2888469;
string key=string.Concat(“Id”,Id);
使用(var session=factory.OpenSession())
{
//表演
var query=session.GetNamedQuery(“GetHeaderDTO”);
SetInt32(“in_nom_id”,id);
query.SetCacheable(true);
query.SetCacheMode(CacheMode.Normal);
query.SetCacheRegion(key);
StartTime=DateTime.Now;
HeaderDTO MyHeader=query.UniqueResult();
EndTime=DateTime.Now;
FirstTry=EndTime-StartTime;
}
使用(var session=factory.OpenSession())
{
//表演
var query=session.GetNamedQuery(“GetHeaderDTO”);
SetInt32(“in_nom_id”,id);
query.SetCacheable(true);
StartTime=DateTime.Now;
HeaderDTO MyHeader=query.UniqueResult();
EndTime=DateTime.Now;
SecondTry=结束时间-开始时间;
}
Assert.IsTrue(FirstTry>SecondTry);
}
但当我运行测试并查看NHibernate日志时:

NHibernate.Impl.SessionImpl:DEBUG[session id=e9de687f-1ef5-4824-9964-9b94f636a15d]为会话工厂[NHibernate.Test/ca36467732ff486380672aeb062ef749]打开了时间戳为551735601467016的会话 NHibernate.Impl.SessionImpl:调试将缓存模式设置为:正常 NHibernate.Loader.Custom.Sql.SQLCustomQuery:调试开始处理Sql查询[{call MyPackage.get_header(:id)}] NHibernate.Loader.Custom.Sql.SQLQueryReturnProcessor:调试将别名[nh]映射到实体后缀[0] NHibernate.Cache.StandardQueryCache:INFO正在区域Id2888469处启动查询缓存 NHibernate.Cache.StandardQueryCache:调试检查区域“Id2888469”中的缓存查询结果;sql:{调用MyPackage.get_头(?)};参数:[];命名参数:{'id'='2888469'} NHibernate.Cache.StandardQueryCache:在缓存中找不到调试查询结果:sql:{call MyPackage.get_header(?)};参数:[];命名参数:{'id'='2888469'} NHibernate.adonnet.AbstractBatcher:调试打开的新IDbCommand,打开IDbCommands:1 NHibernate.adonnet.AbstractBatcher:调试为SqlString生成IDbCommand对象:{call MyPackage.get_header(?)} NHibernate.Type.Int32Type:调试将“2888469”绑定到参数:0 NHibernate.Loader.Loader:INFO{call MyPackage.get_头(:p0)} NHibernate.SQL:DEBUG{call MyPackage.get_头(:p0)};:p0=2888469[类型:Int32(0)] 废话 废话 NHibernate.adonnet.ConnectionManager:调试数据库连接 NHibernate.Connection.ConnectionProvider:调试关闭连接 NHibernate.Loader.Loader:调试对象总数:1 NHibernate.Engine.TwoPhaseLoad:调试[MyAssembly.HeaderTo#2888469]的解析关联 NHibernate.Engine.TwoPhaseLoad:调试将实体添加到二级缓存:[MyAssembly.HeaderTo#2888469] NHibernate.Cache.ReadWriteCache:调试缓存:MyAssembly.HeaderTo#2888469 NHibernate.Cache.ReadWriteCache:DEBUG Cached:MyAssembly.HeaderDTO#2888469 NHibernate.Engine.TwoPhaseLoad:调试完成实体化[MyAssembly.HeaderTo#2888469] NHibernate.Engine.StatefulPersistenceContext:调试初始化非惰性集合 NHibernate.Cache.StandardQueryCache:调试区域中的缓存查询结果:“Id2888469”;sql:{调用MyPackage.get_头(?)};参数:[];命名参数:{'id'='2888469'} NHibernate.adonnet.ConnectionManager:自动提交后调试 NHibernate.Impl.SessionImpl:调试事务完成 NHibernate.adonnet.ConnectionManager:调试数据库连接 NHibernate.Impl.SessionImpl:调试将缓存模式设置为:正常 NHibernate.Impl.SessionImpl:调试[会话id=e9de687f-1ef5-4824-9964-9b94f636a15d]正在运行ISession.Dispose() NHibernate.Impl.SessionImpl:DEBUG[session id=e9de687f-1ef5-4824-9964-9b94f636a15d]正在执行实际处置(True) NHibernate.Impl.SessionImpl:调试关闭会话 NHibernate.adonnet.AbstractBatcher:调试运行BatcherImpl.Dispose(true) NHibernate.Impl.SessionImpl:DEBUG[session id=78820256-77e8-4596-8374-98f8b5cc946b]在时间戳5517356016148480处打开会话,用于会话工厂:[NHibernate.Test/ca36467732ff486380672aeb062ef749] NHibernate.Loader.Custom.Sql.SQLCustomQuery:调试开始处理Sql查询[{call MyPackage.get_header(:id)}] NHibernate.Loader.Custom.Sql.SQLQueryReturnProcessor:调试将别名[nh]映射到实体后缀[0] NHibernate.Cache.StandardQueryCache:调试检查区域中的缓存查询结果:“NHibernate.Cache.StandardQueryCache”;sql:{调用MyPackage.get_头(?)};参数:[];命名参数:{'id'='2888469'} NHibernate.Cache.StandardQueryCache:在缓存中未找到调试查询结果:sql:{调用MyPackage.get_头(?)};参数:[];命名参数:{'id'='2888469'} NHibernate.adonnet.AbstractBatcher:调试打开的新IDbCommand,打开IDbCommands:1 NHibernate.adonnet.AbstractBatcher:调试为SqlString生成IDbCommand对象:{call MyPackage.get_header(?)} NHibernate.Type.Int32Type:调试将“2888469”绑定到参数:0 NHibernate.Loader.Loader:INFO{call MyPackage.get_头(:p0)} NHibernate.SQL:DEBUG{call MyPackage.get_头(:p0)};:p0=2888469[类型:Int32(0)] NHibernate.Connection.DriverConnectionProvider:调试IDbCon
[TestMethod]
public void Cacching_Entity_FirstCallIsCached()
{
DateTime StartTime;
DateTime EndTime;
TimeSpan FirstTry;
TimeSpan SecondTry;
int Id = 2888469;
string key = string.Concat("Id", Id);

using (var session = factory.OpenSession())
{
    //Act
    var query = session.GetNamedQuery("GetHeaderDTO");
    query.SetInt32("in_nom_id", Id);
    query.SetCacheable(true);
    query.SetCacheMode(CacheMode.Normal);
    query.SetCacheRegion(key);
    StartTime = DateTime.Now;
    HeaderDTO MyHeader = query.UniqueResult<HeaderDTO>();
    EndTime = DateTime.Now;
    FirstTry = EndTime - StartTime;
}

using (var session = factory.OpenSession())
{
    //Act
    var query = session.GetNamedQuery("GetHeaderDTO");
    query.SetInt32("in_nom_id", Id);
    query.SetCacheable(true);
    StartTime = DateTime.Now;
    HeaderDTO MyHeader = query.UniqueResult<HeaderDTO>();
    EndTime = DateTime.Now;
    SecondTry = EndTime - StartTime;
}

Assert.IsTrue(FirstTry>SecondTry);
}
using (var session = factory.OpenSession())
using (var tx = session.BeginTransaction())
{
    //Act
    var query = session.GetNamedQuery("GetHeaderDTO");
    query.SetInt32("in_nom_id", Id);
    query.SetCacheable(true);
    query.SetCacheMode(CacheMode.Normal);
    query.SetCacheRegion(key);
    StartTime = DateTime.Now;
    HeaderDTO MyHeader = query.UniqueResult<HeaderDTO>();
    EndTime = DateTime.Now;
    FirstTry = EndTime - StartTime;

    tx.Commit();
}

using (var session = factory.OpenSession())
using (var tx = session.BeginTransaction())
{
    //Act
    var query = session.GetNamedQuery("GetHeaderDTO");
    query.SetInt32("in_nom_id", Id);
    query.SetCacheable(true);
    StartTime = DateTime.Now;
    HeaderDTO MyHeader = query.UniqueResult<HeaderDTO>();
    EndTime = DateTime.Now;
    SecondTry = EndTime - StartTime;

    tx.Commit();
}