即使在关闭会话之后,Hibernate也会在oracle db中保持非活动会话

时间:2015-06-24 11:07:32

标签: java oracle hibernate session hibernate-mapping

在我的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 ;

如何通过hibernate终止所有非活动会话。任何人都可以帮我解决这个问题。

2 个答案:

答案 0 :(得分:1)

确保您没有多次创建sessionFactory

在您的finally代码中尝试以下操作:

if (session != null && session.isOpen()) {
    session.flush();
    session.close();
}

每次获得会话时,如果需要,都会创建一个新的数据库连接(例如:事务已启动)。最好使用连接池来克服这种行为。

来自docs

修改

  然而, Hibernate自己的连接池算法非常简陋。它旨在帮助您入门,不打算在生产系统中使用,甚至不用于性能测试。

我建议你在处理来自图书馆创作者的 rudimentary 的问题之前使用连接池...

答案 1 :(得分:0)

您在Oracle数据库中为此用户注意了多少个非活动会话?

如果您看到一个,那么它可能与您在数据库中打开的SQL终端会话有关。

如果您看到它多于一个并且每次执行代码时计数都在不断增加,那么您就不会正确释放连接。这可能是连接泄漏。

或者可能是您确实在使用连接池,而非活动连接与它管理的连接相关。此处不活动意味着它们当前未执行操作。这并不意味着存在连接泄漏。发布您的配置将有助于解决问题。 您可以通过生成堆栈跟踪或通过代码进行调试来验证您是否正在使用连接池。

此外,请确保没有其他应用程序使用相同的凭据访问数据库。