NHibernate二级缓存不与HashTableCacheProvider一起使用
我基本上只是想重现Ayende的第一级和第二级缓存 我已将配置连接为: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<
<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();
}