hibernate中的会话和会话工厂

时间:2015-01-20 04:06:28

标签: java hibernate session sessionfactory

我正在使用Java,Hibernate和SQL Server创建一个应用程序。我对Session和Session Factory的对象声明有疑问。 起初,当我开始创建应用程序时,我曾经在需要时始终创建会话和会话工厂。但是现在我注意到当我创建会话和会话工厂时我的应用程序变得很慢,所以我开始在我的登录页面创建所有需要的会话和会话工厂,并将修饰符指定为公共静态。

    public static Session session = null;
    public static SessionFactory sessionfactory = new org.hibernate.cfg.Configuration().configure().buildSessionFactory();
    public static Session session1 = null;
    public static SessionFactory sessionfactory1 = new org.hibernate.cfg.Configuration().configure().buildSessionFactory();
    public static Session session2 = null;
    public static SessionFactory sessionfactory2 = new org.hibernate.cfg.Configuration().configure().buildSessionFactory();

现在每当我需要使用会话和会话工厂时,我用来将会话称为Login.session(loginpagefilename.sessionobject)。

 Login.session = Login.sessionfactory.openSession();
        Login.session.beginTransaction();
        String hql = "FROM TEST_SERVICES_POJO lts WHERE NOT EXISTS (SELECT lsm.inttestid FROM PARAMETER_MAPPING_POJO lsm WHERE lsm.status = 1 and lsm.inttestid=lts.inttestid)";
        org.hibernate.Query query = Login.session.createQuery(hql);
        DefaultTableModel model = (DefaultTableModel) testtable.getModel();
        model.setRowCount(0);
        for (Iterator it = query.iterate(); it.hasNext();) {
            TEST_SERVICES_POJO slp = (TEST_SERVICES_POJO) it.next();
            Object[] row = {slp.getTestname()};
            model.addRow(row);
        }
        Login.session.getTransaction().commit();

这里首先我没有使用hibernate的回滚功能。但是现在我希望实现hibernate的回滚功能。所以遵循哪种方法会给我更好的表现。请建议我一个方法。提前谢谢。

1 个答案:

答案 0 :(得分:1)

最重要的事情:永远不要为每个应用程序创建多个SessionFactory(除非您有多个持久性上下文,然后为每个应用程序和持久性上下文创建一个)。保持创建SessionFactories将首先导致您的性能下降,然后因OutOfMemoryError s而导致您的应用服务器失效。在应用程序启动时创建一个SessionFactory并将其保存在可访问的位置 - 将其存储在jndi中,将其保存在全局类或类似的内容中。

根据需要创建Session - 最佳匹配通常是每个事务一个Session,因此hibernate可以利用其缓存机制。