Я использую 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 Когда клиент впервые обращается к этому веб-сервису, консоль показывает, что 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();
if (result.BuyerName != "")
{
hSession = NHibernateHelper.GetSession();
task = hSession.Get<Model.Task>(request.TaskId);
result.BuyerName = task.BuyerAccount.BuyerName;
hSession.Close();
}
retrun result;`
Я использовал тот же клиент для доступа к измененному веб-сервис. На этот раз консоль показала, что NHibernate выполнил 2 sql запросов. Кэш второго уровня, похоже, снова заработал.
Наконец, я добавил журнал отладки с журналом 4net и обнаружил, что NHibernate автоматически очищает все кэши второго уровня. Потому что, если тот же код выполняется в обычной тестовой программе, автоматическая очистка c не будет выполнена, поэтому я предполагаю, что это связано с управлением потоками веб-службы или содержимого сеанса.
`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`