我正在开发一个JavaFX Hibernate桌面应用程序。我配置了我的应用程序,以便从应用程序运行到关闭时使用相同的会话。 我就这样做了:
public static Session getCurrentSession() {
if (sessionFactory != null) {
Session session = sessionFactory.getCurrentSession();
if (session != null) {
return sessionFactory.getCurrentSession();
} else {
session = sessionFactory.openSession();
session.beginTransaction();
return session;
}
}
return null;
}
当用户关闭应用程序时,我运行第二个关闭会话和SessionFactory的方法。
public static void closeConnections() {
if (sessionFactory != null) {
if (sessionFactory.getCurrentSession().isOpen()) {
sessionFactory.getCurrentSession().close();
}
sessionFactory.close();
}
}
我是Hibernate的新人,所以和我一起好心的PEACE
答案 0 :(得分:4)
Hibernate会话应被视为“单一工作单元”。一个或多个事务可以存在于会话中。在大多数情况下,最佳做法是session-per-request。在处理请求开始时打开一个会话,最后将其关闭。
Hibernate的第一级缓存在“Session”中保留,因此如果你在用户会话中保留它,它将会点击“缓存”对象。
Hibernate具有二级缓存,您必须配置(如果需要)才能利用。第二级基本上支持以下内容:查询,带有加载和获取的对象,以及集合/关联,并在Sessions,SessionFactories和Clusters之间提供缓存对象。
您没有为每个应用程序使用一个会话,您正在使用“当前会话”概念,该概念会打开会话并将其存储在上下文中。如果您不关闭会话,它将保留在那里。
答案 1 :(得分:2)
好的,对于你的基本问题:
一遍又一遍地使用相同的Hibernate会话是一个好习惯吗?
答案是否定的,会话对象不应该长时间保持打开状态,因为它们通常不是线程安全的,应该根据需要创建和销毁它们。
通常在休眠中完成的是:
您打开会话(基本上是数据库连接),执行事务,然后关闭连接(关闭会话)。换句话说,您可以查看其他帖子的类比:
What is the difference between a session and a transaction in JPA 2.0?
希望有所帮助