在我的应用程序中打开的位置和关闭SessionFactory的位置

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类方法中,我打开会话工厂并关闭它.所以我只能打开/关闭会话工厂一次申请.提前致谢.

Ser*_*sta 8

规则是您应该在整个应用程序中只有一个SessionFactory.

打开和关闭的位置取决于应用程序:

  • 对于经典应用程序,它将在main中打开和关闭.
  • 对于Web应用程序,它将在ServletContextListener中打开和关闭(分别在contextInitialized和contextDestroyed事件中)

您也可以使用单例并以静态方法创建它,并像上面那样在结尾处关闭它.

但请不要在DAO方法结束时关闭会话工厂.

对于会话,你会得到一个在工作中的一个单元的开始通过openSession,并关闭它后提交或回滚(在异常的,必须回退的情况下,并立即关闭会话).但是Hibernate手册指出:Hibernate org.hibernate.Session的范围很灵活,但是你永远不应该设计你的应用程序来为每个数据库操作使用新的Hibernate org.hibernate.Session.尽管在以下示例中使用它,但请考虑每个操作的会话是反模式.

通常,您将根据需要的事务使用一个会话.例如,在Web应用程序中,每个请求的会话是一种常见设计.

但是您也可以使用像Spring这样的更高级别的框架,它将为您完成所有SessionFactory和Session管理.


OO7*_*OO7 5

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.