【发布时间】:2020-06-11 04:24:02
【问题描述】:
我使用 SysCache2 作为 NHibernate 的二级缓存提供程序。 下面是测试代码:
`ISession session = NHibernateHelper.GetSession();
Model.Task t1 = session.Get<Model.Task>("e84wqbarscj5");
richTextBox1.AppendText(t1.BuyerAccount.BuyerName);
session.Close();`
第一次运行测试代码,控制台显示NHibernate执行了两次sql查询。 第二次运行测试代码,控制台显示NHibernate没有执行任何SQL查询。 而且我认为这说明二级缓存工作正常。
接下来,我在一个网络服务中执行类似的代码,代码如下:
`AppServiceGetTaskResponse result = new AppServiceGetTaskResponse();
ISession hSession = NHibernateHelper.GetSession();
Model.Task task = hSession.Get<Model.Task>(request.TaskId);
result.BuyerName = task.BuyerAccount.BuyerName;
hSession.Close();
retrun result;`
我第一次使用Http客户端访问这个web服务,控制台显示NHibernate执行了两次sql查询。这可以。 我第二次使用同一个客户端访问web服务,但是这次二级缓存没有按预期工作。控制台显示NHibernate再次执行了两次sql查询。
我做了新的尝试,修改代码如下:
`AppServiceGetTaskResponse result = new AppServiceGetTaskResponse();
ISession hSession = NHibernateHelper.GetSession();
Model.Task task = hSession.Get<Model.Task>(request.TaskId);
result.BuyerName = task.BuyerAccount.BuyerName;
hSession.Close();
if (result.BuyerName != "")
{
hSession = NHibernateHelper.GetSession();
task = hSession.Get<Model.Task>(request.TaskId);
result.BuyerName = task.BuyerAccount.BuyerName;
hSession.Close();
}
retrun result;`
我使用同一个客户端访问修改后的 Web 服务。这次控制台显示 NHibernate 执行了 2 个 sql 查询。二级缓存似乎又可以工作了。
最后用log4net添加调试日志,发现NHibernate自动清空了所有二级缓存。因为如果在正常的测试程序中运行相同的代码,是不会进行自动清理的,所以我猜是和web服务的线程管理或者会话内容有关。
`NHibernate.Impl.SessionFactoryImpl: 2020-02-28 13:17:01,185 DEBUG evicting second-level cache for: Model.BuyerAccount
NHibernate.Impl.SessionFactoryImpl: 2020-02-28 13:17:01,185 DEBUG evicting second-level cache for: Model.Buyer`
【问题讨论】:
标签: c# web-services nhibernate sessionfactory second-level-cache