#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, я изменил создание фабрики сеансов, чтобы оно происходило при запуске приложения.