【问题标题】:Hibernate queries to postgres休眠查询到 postgres
【发布时间】:2013-02-06 20:02:13
【问题描述】:

我的 VPS 主机上安装了 jsp webapp,以 tomcat 7 作为服务器。我正在使用 Hibernate 3 和 PostgreSQL。我的类 DBManager 中的所有方法(负责数据库服务、连接、查询)都使用几乎相同的结构:

 Session session = sessionFactory.openSession();
    session.beginTransaction();
    =======
    HERE HQL QUERY/session.get/update/save etc are executed
    =======
    session.getTransaction().commit();
    session.close();

问题是我的 VPS 一段时间后(使用我的 webapp)显示了许多空闲的 postgres 进程,这导致服务器过载,并且 e.x VPS 杀死了 Java 或拒绝连接到 DB。我能做些什么来消除这个问题?这是我的代码引起的问题还是其他原因?

【问题讨论】:

    标签: java hibernate jsp tomcat


    【解决方案1】:

    您需要将session.close() 放入try/finally 块中:

    try {
      session.beginTransaction();
      =======
      HERE HQL QUERY/session.get/update/save etc are executed
      =======
      session.getTransaction().commit();
    } catch (SQLException sqle) {
      // handle the exception, e.g. session.getTransaction().rollback();
    } finally {
      session.close(); // this will require another try/catch
    }
    

    如果代码中某处发生异常,会话不会关闭并会泄漏资源。

    【讨论】:

    • 谢谢回答,我现在就测试一下。但准确地说:try{...}catch(){handle exception}finally{session.close() in another try/finally} ?
    • 看看这篇文章,它涵盖了您的场景并有代码示例:ibm.com/developerworks/websphere/library/bestpractices/… -- 它指的是 JDBC 连接,但几乎同样适用于休眠会话。
    • 嘿,我使用了你的解决方案。如您所说,postgres 进程仍然空闲在我的服务器上。执行并导致对 db 进行查询的每项操作稍后都会显示为与我的数据库的空闲连接...
    • 你在使用连接池吗?如果是这样,有一些空闲连接是正常的。显然,如果您的连接数不断增长,那就是个问题。
    • 我不是。我已经检查过hibernate有它自己的,称为c3p0,但我找不到没有spring或maven的方法来使用它。我的意思是:向 hibernate.cfg 添加属性但出现错误:org.hibernate.HibernateException:无法实例化连接提供程序:org.hibernate.connection.C3P0ConnectionProvider
    【解决方案2】:

    问题解决了。我做错的是在类的每个实例中创建新工厂。现在我在各处添加了静态引用,效果很好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-24
      • 2015-01-25
      • 1970-01-01
      • 2011-08-09
      相关资源
      最近更新 更多