Неактивные сеансы, оставленные открытыми NHibernate

#c# #oracle #nhibernate #fluent-nhibernate

#c# #Oracle #nhibernate #свободно-nhibernate

Вопрос:

Я использую Nhibernate для подключения к базе данных Oracle 11g. Администратор базы данных попросил меня взглянуть на программу, поскольку множество неактивных сеансов остаются открытыми, и, по-видимому, это скоро приведет к сбою сервера.

Почему Nhibernate не закрывает соединения? Вот пример кода:

 public void Foo()
{
    using (_sessionFactory = _Configuration.BuildSessionFactory())
    using (_session = _sessionFactory.OpenSession())
    {
        _session.Transaction.Begin();
        //DO STUFF
        _session.Transcation.Commit();
    }
}
 

У меня сложилось впечатление, что удаление сеанса и SessionFactory вызовет сеанс.Close() и соединение будет закрыто.

Это просто объединение пулов соединений, выполняющее свою работу? Если да, то есть ли способ, которым я могу установить максимальный размер для пула соединений? Идеально в свободном Nhibernate?

Комментарии:

1. вы можете изменить объединение в строке подключения.

2. @Fran ах, я этого не знал, каков синтаксис для этого. Что произойдет, если мне понадобится 11 подключений одновременно, а максимальный размер пула будет установлен на 10?

3. смотрите здесь ( connectionstrings.com/oracle ) для справки по строке подключения. у вас может быть 11, если все соединения в пуле израсходованы, а пул увеличился на единицу. размер увеличения / уменьшения доступен в строке подключения, а также в максимальном размере пула.

4. @Fran отлично, и это работает только с Nhibernate? Извините за основные вопросы, никогда раньше не слышал об этих настройках.

5. Так и должно быть. Помните, что под прикрытием nhibernate просто использует ado.net подключение, и все это допустимые параметры для строки подключения.

Ответ №1:

Глядя на ваш код, кажется, что ваш код позволяет создавать несколько экземпляров фабрик сеансов, лучше всего создавать только одну фабрику сеансов.

И когда вы используете пул подключений, для каждой фабрики сеансов создается пул подключений, и кажется, что это приводит к появлению неактивных подключений.

Ответ №2:

Похоже, проблема была вызвана использованием транзакций. Удаление транзакций из приведенного выше кода привело к следующему:

 public class DoSomethingToDb(ISessionFactory sessionFactory)
{
  using (_sessionFactory = _Configuration.BuildSessionFactory())
  using (ISession session = sessionFactory.OpenSession())
  {

      //Do Stuff
      session.Flush();
  }
}
 

Что, похоже, не вызывает проблем.

Однако, как было предложено @LowFlyingPelican, я изменил создание фабрики сеансов, чтобы оно происходило при запуске приложения.