Hibernate, сохраняющий неактивный сеанс в oracle db даже после закрытия сеанса
В моем приложении hibernate ниже я написал код для сохранения объекта EmployeeRegistration в oracle db.
public Integer submitDetails(EmployeeRegistration es)
{
Session session = factory.openSession();
Transaction tx = null;
Integer employeeID = null;
try
{
tx = session.beginTransaction();
employeeID = (Integer)session.save(es);
session.flush();
tx.commit();
}
catch(HibernateException e)
{
if(tx != null)
{
tx.rollback();
}
e.printStackTrace();
}
finally
{
if(session.isOpen()) {
session.close();
}
}
return employeeID;
}
После закрытия сеанса он сохраняет неактивные сеансы в oracle db. Я проверил неактивный сеанс, используя приведенный ниже запрос в Oracle.
SQL> select USERNAME,COUNT(*) FROM V$SESSION WHERE STATUS='INACTIVE' GROUP BY USERNAME ;
Как убить весь неактивный сеанс через спящий режим. Может ли кто-нибудь помочь мне в решении этой проблемы.
2 ответа
Убедитесь, что вы не создаете sessionFactory
несколько раз.
В вашем finally
код попробуйте следующее:
if (session != null && session.isOpen()) {
session.flush();
session.close();
}
Каждый раз, когда вы получаете сеанс, при необходимости создается новое соединение с базой данных (например, транзакция запущена). Для преодоления этого поведения лучше использовать пул соединений.
Редактировать из документов
Собственный алгоритм пула соединений Hibernate, тем не менее, довольно элементарен. Он предназначен для того, чтобы помочь вам начать работу, и не предназначен для использования в производственной системе или даже для тестирования производительности.
Я бы посоветовал вам использовать пул соединений перед тем, как приступить к решению проблем, возникающих у создателей библиотеки...
Сколько неактивных сеансов вы заметили в базе данных Oracle для этого пользователя?
Если вы видите один, то это может быть связано с сеансом терминала SQL, который вы открыли с базой данных.
Если вы видите, что оно больше одного, и число продолжает увеличиваться каждый раз, когда вы выполняете свой код, то вы не освобождаете соединения должным образом. Это может быть утечка соединения.
Или может случиться так, что вы действительно используете пул соединений, а неактивные соединения связаны с соединениями, которыми он управляет. Неактивное здесь означает, что они в данный момент не выполняют действие. Это не означает, что произошла утечка соединения. Размещение вашего конфига поможет пролить свет. Вы можете проверить, используете ли вы пул соединений, сгенерировав трассировку стека или отладив код.
Также убедитесь, что нет другого приложения, которое обращается к базе данных с такими же учетными данными.