Sri*_*Sri 2 java session hibernate
我正在开发jsf应用程序并使用hibernate作为后端.我想创建会话工厂并通过应用程序关闭它一次.我正在用util类创建Session工厂.
import org.hibernate.HibernateException;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
public class HibernateUtil
{
private static SessionFactory sessionFactory;
private static ServiceRegistry serviceRegistry;
static
{
try
{
Configuration configuration = new Configuration().configure();
serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();
sessionFactory = configuration.buildSessionFactory(serviceRegistry);
}
catch (HibernateException he)
{
System.err.println("Error creating Session: " + he);
throw new ExceptionInInitializerError(he);
}
}
public static SessionFactory getSessionFactory()
{
return sessionFactory;
}
}
public static void closeFactory() {
if (sessionFactory != null) {
try {
sessionFactory.close();
} catch (HibernateException ignored) {
log.error("Couldn't close SessionFactory", ignored);
}
}
}
Run Code Online (Sandbox Code Playgroud)
在我的每个DAO类方法中,我打开会话工厂并关闭它.所以我只能打开/关闭会话工厂一次申请.提前致谢.
规则是您应该在整个应用程序中只有一个SessionFactory.
打开和关闭的位置取决于应用程序:
您也可以使用单例并以静态方法创建它,并像上面那样在结尾处关闭它.
但请不要在DAO方法结束时关闭会话工厂.
对于会话,你会得到一个在工作中的一个单元的开始通过openSession,并关闭它后提交或回滚(在异常的,必须回退的情况下,并立即关闭会话).但是Hibernate手册指出:Hibernate org.hibernate.Session的范围很灵活,但是你永远不应该设计你的应用程序来为每个数据库操作使用新的Hibernate org.hibernate.Session.尽管在以下示例中使用它,但请考虑每个操作的会话是反模式.
通常,您将根据需要的事务使用一个会话.例如,在Web应用程序中,每个请求的会话是一种常见设计.
但是您也可以使用像Spring这样的更高级别的框架,它将为您完成所有SessionFactory和Session管理.
SessionFactory:SessionFactory的工作是处理应用程序中的所有会话。通常,应用程序中只有一个 sessionFactory允许创建与执行 CRUD 操作所需的会话一样多。
SessionFactory 是不可变的和线程安全的。因此多个线程可以访问同一个 sessionFactory 对象。
static {
try {
Configuration configuration = new Configuration().configure("hibernate.cfg.xml");
serviceRegistry = new StandardServiceRegistryBuilder().applySettings(
configuration.getProperties()).build();
sessionFactory = auditConfiguration.buildSessionFactory(serviceRegistry);
} catch (Throwable ex) {
System.err.println("Initial SessionFactory creation failed." + ex);
throw new ExceptionInInitializerError(ex);
}
}
Run Code Online (Sandbox Code Playgroud)
Session: Session 是一个轻量级的非线程安全对象。因此,会话不能在多个线程之间共享。它应该对DB的每个事务中创建任意创建,读取,更新或删除与交易时是做必须关闭。
try {
Session session = sessionFactory.openSession();
// do some CRUD operation
} catch(Exception ex) {
// On error, revert all changes done
if (transaction != null) {
transaction.rollback();
}
} finally {
if (session != null) {
session.close();
}
}
Run Code Online (Sandbox Code Playgroud)
所以我建议你打开/关闭session而不是sessionFactory.