我的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。我该怎么做才能解决问题?这是由我的代码或其他原因引起的问题吗?
答案 0 :(得分:0)
您需要在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
}
如果代码中某处发生异常,则会话不会关闭并泄漏资源。
答案 1 :(得分:0)
问题解决了。我做错了是在每个类的实例中创建新工厂。现在我在任何地方都添加了静态引用,它工作得非常好。