何时在Hibernate中关闭数据库连接?

5

首先,这可能听起来像是一个重复的问题,但我没有得到期望的解决方案,所以我发布了这个新问题。我几天前开始学习Hibernate。我卡在这个问题上:

这是我的代码:

public static void open_connection()

sessionfactory=new Configuration().configure().buildSessionFactory();
Listsession = sessionfactory.openSession();
}

public  List select(String qry)
{ 
    open_connection();  
    Listsession.beginTransaction();
    query =Listsession.createQuery(qry);
    list=query.list();
    Listsession.getTransaction().commit();
    Listsession.close();
    sessionfactory.close();
    }

问题1. 当查询运行时,我关闭了sessionfactory。这是一个好的方法吗?我希望在不需要数据库连接时关闭它,就像在JDBC中一样(我的老师教过我这样做)。

问题2. 用户从我的网站注销时,我应该关闭连接吗?

问题3. sessionfactory.close(); 也会销毁我的会话变量(session.setattribute("user",ur);)吗?

问题4. Listsession.getTransaction().commit(); 是否也会关闭事务?

我想知道这个问题是因为很多时候我在netbeans上运行我的项目时会得到空指针异常,但当我在线上运行同一项目时却不会出现空指针异常,我认为这是因为每次运行我的项目时都调用了openconnection。对于发布这么多问题,我很抱歉,因为我找不到我所寻找的确切答案。


1
长生命周期会话还是短生命周期会话? - Grim
@PeterRader 短暂的会话,如20-30分钟。 - Fresher
20分钟是长寿命会话;D。5秒钟是短寿命会话。 - Grim
@PeterRader 好的,我以为会话超时-1是一个长时间的会话。 - Fresher
等等,long-lived-sessionsshort-lived-sessions 是编写 Hibernate 代码的模式。实际上,你必须决定是使用短生命周期会话还是长生命周期会话。在这种情况下,你的代码非常糟糕,因为在 select() 外部,n-m 关系以及延迟查询都无法工作,因为会话、连接或事务已经消失了。 - Grim
显示剩余4条评论
1个回答

6

1.你应该关闭Session,而不是SessionFactory
2.在执行查询后,您已经关闭了Session,那么在从网站logout时再次关闭的意义何在?
3.Hibernate中的HttpSessionSession不同。 HttpSession用于存储属性以维护用户请求的顺序。但Hibernate中的Session仅用于与数据库交互。因此,在Hibernate中关闭Session不会反映在HttpSession中。
4.如果您正在使用openSession(),则应手动关闭会话。但如果您正在使用getCurrentSession(),则无需担心,一旦事务提交,会话将自动关闭。
希望这有所帮助。


如果我在用户登录时调用OpenSession,在用户注销时关闭它,这是一个好的方法吗?什么是最佳连接或我上面使用的每次打开和关闭连接的方法。 - Fresher
Listsession.close(); 定义在哪里?最佳连接取决于单个请求对数据库的访问次数。如果访问次数更多,请使用 openSession,否则请使用 getCurrentSession() - Mr.Chowdary
所以你的意思是上述方法是错误的。我应该在登录时创建一个连接,并在注销时关闭它。实际上,我无法理解你的意思,因为这是一个社交网络网站,所以会有很多用户使用它。 - Fresher
如果单个用户登录,假设从不同的表中获取数据以在不同的小部件中显示数据。在这种情况下,在第一个方法查询中打开会话,并在最后一个方法查询执行时关闭会话。这仅适用于单个用户。它与用户登录和注销无关。当您需要从数据库获取数据时,请打开连接,并在提供请求之前关闭连接。 - Mr.Chowdary
你不应该在应用程序存在时使用 `sessionfactory.close();'。而且你应该始终只关闭 Session。 - Mr.Chowdary
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接