【问题标题】:NHibernate second level cache is automatically cleared by NHibernate in web serviceNHibernate 二级缓存由 NHibernate 在 web 服务中自动清除
【发布时间】: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


    【解决方案1】:

    我自己解决了这个问题。在web服务中,有一个写log的方法被执行,它使用执行native SQL的方法:session.CreateSQLQuery("insert into ..."),这会导致NHibernate自动对2-执行一次evict操作级缓存。我改用 session.save() 方法,问题就解决了。 但是原理我没看懂,谁能帮我解答一下?

    【讨论】:

      猜你喜欢
      • 2011-02-09
      • 2011-09-02
      • 1970-01-01
      • 1970-01-01
      • 2010-12-19
      • 1970-01-01
      • 2011-10-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多