2015-04-06 5 views
0

У меня есть приложение JSP, Servlet (Pure JSP, Servlet), где он использует Hibernate. Ниже приведен класс реализации Hibernate для одной таблицы.Проблема с спящим режимом с `SessionFactory`

DesignationImpl.java

package dao; 

import model.sub.DesigAllBean; 
import java.util.List; 
import model.main.Designation; 
import org.hibernate.Query; 
import org.hibernate.SQLQuery; 
import org.hibernate.Session; 
import org.hibernate.SessionFactory; 
import org.hibernate.Transaction; 
import org.hibernate.boot.registry.StandardServiceRegistryBuilder; 
import org.hibernate.cfg.Configuration; 

/** 
* 
* @author Yohan 
*/ 
public class DesignationImpl implements DesignationInterface 
{ 


    @Override 
    public Session openCurrentSession() { 
      Session currentSession = getSessionFactory().openSession(); 
      return currentSession; 
    } 

    @Override 
    public Transaction openTransaction(Session session) { 
     Transaction beginTransaction = session.beginTransaction(); 
     return beginTransaction; 
    } 

    private static SessionFactory getSessionFactory() { 

     Configuration configuration = new Configuration().configure(); 
     StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder() 
         .applySettings(configuration.getProperties()); 
     SessionFactory sessionFactory = configuration.buildSessionFactory(builder.build()); 
     return sessionFactory; 
    } 

    @Override 
    public void save(Designation d, Session session) 
    { 
     session.save(d); 
    } 

    @Override 
    public void update(Designation d, Session session) 
    { 
     session.update(d); 
    } 
} 

Ниже класса обслуживания, который вызывает в класс выше.

DesignationService .java

package service; 

import dao.Common; 
import model.sub.*; 
import dao.DesignationImpl; 
import dao.DesignationInterface; 
import java.util.ArrayList; 
import java.util.List; 
import model.main.Designation; 
import org.hibernate.Session; 
import org.hibernate.Transaction; 

/** 
* 
* @author Yohan 
*/ 
public class DesignationService 
{ 
    private DesignationInterface designationInterface; 

    public DesignationService() 
    { 
     designationInterface = new DesignationImpl(); 
    } 

    public Session getSession() 
    { 
     Session session = designationInterface.openCurrentSession(); 
     return session; 
    } 

    public Transaction getTransaction(Session session) 
    { 
     return designationInterface.openTransaction(session); 
    } 

    public String save(Designation d) 
    { 
     Session session = designationInterface.openCurrentSession(); 
     Transaction transaction = null; 
     String result=""; 

     try 
     { 
      transaction = designationInterface.openTransaction(session); 
      designationInterface.save(d,session); 
      transaction.commit(); 
      result = Common.SAVE_SUCCESS; 
     } 
     catch(Exception e) 
     { 
      e.printStackTrace(); 

      if(transaction!=null) 
      { 
       transaction.rollback(); 
      } 
      result = Common.SAVE_ROLLBACK; 
     } 
     finally 
     { 
      session.close(); 
     } 

     return result; 
    } 

    public String update(Designation d) 
    { 
     Session session = designationInterface.openCurrentSession(); 
     Transaction transaction = null; 
     String result=""; 

     try 
     { 
      transaction = designationInterface.openTransaction(session); 
      designationInterface.update(d,session); 
      transaction.commit(); 
      result = Common.SAVE_SUCCESS; 
     } 
     catch(Exception e) 
     { 
      e.printStackTrace(); 

      if(transaction!=null) 
      { 
       transaction.rollback(); 
      } 
      result = Common.SAVE_ROLLBACK; 
     } 
     finally 
     { 
      session.close(); 
     } 

     return result; 
    } 
} 

И сервлеты называть их, как показано ниже.

DesignationService desigSrvc=new DesignationService(); 

     Designation designation=desigSrvc.findByForiegnKey(idEmployee); 

     Employee empl=new Employee(); 
     empl.setIdEmployee(idEmployee); 

     if(designation.getDateCreated()==null) 
     { 
      designation.setDateCreated(Common.getCurrentDateSQL()); 
     } 

     designation.setEmployee(empl); 
     designation.setDesignation(txtDesignation); 
     designation.setLocation(location); 
     designation.setSalary(salary); 
     designation.setDatePromoted(datePromoted); 
     designation.setLastUpdated(Common.getCurrentDateSQL());  

     desigSrvc.save(designation); 

Как вы можете видеть, это плохо там происходит, то есть, сервлеты создавать новые SessionFactory экземпляры каждый раз, когда он executes.I меня возникли Driver#Connect вопросы, и я думаю, что это может быть причиной для этого ,

Я читаю сообщения stackoverflow и некоторые, кажется, предлагают использовать только один SessionFactory для всего приложения. Если это подходит, то как я могу это сделать? Может быть, сделать одноэлементный класс, как показано ниже, и использовать его в моих классах реализации?

public class SessionFactoryBuilder 
{ 
    private static SessionFactoryBuilder instance; 
    private static SessionFactory sessionFactory; 

    private SessionFactoryBuilder() 
    { 
    } 

    private static void buildConfig() 
    { 
     Configuration configuration = new Configuration().configure(); 
      StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder() 
          .applySettings(configuration.getProperties()); 
      sessionFactory = configuration.buildSessionFactory(builder.build()); 
    } 

    public static SessionFactoryBuilder getInstance() 
    { 
     if(instance == null) 
     { 
      instance = new SessionFactoryBuilder(); 
      buildConfig(); 
     } 
     return instance; 
    } 

    public SessionFactory getSessionFactory() 
    { 
     return sessionFactory; 
    } 
} 

Но как насчет потоков? Сервлеты многопоточные, не так ли?

+0

где ваше обозначениеИнтерфейс? – Pratik

+0

Привет, вам нужно создать однопроцессорный класс sessionfactory. Я думаю, что он должен решить ваш poroblem .. –

ответ

2

Как я уже говорил, у меня есть класс HibernateUtil.java как Singleton. Этот класс может предоставить вам SessionFactory с помощью HibernateUtil.getSessionFactory(), и вы должны удалить кода, связанного с вашего класса DesignationImpl

public class HibernateUtil { 

private static StandardServiceRegistry serviceRegistry; 
private static SessionFactory INSTANCE = null; 
public static SessionFactory getSessionFactory() { 
    if(INSTANCE=null){ 
      createSessionFactory(): 
     } 
     return sessionFactory; 
} 
private synchronized static void createSessionFactory(){ 
    if(INSTANCE!=null){return;} 
    Configuration configuration = new Configuration(); 
    configuration.configure(); 
    SeviceRegistry=newStandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build(); 
    sessionFactory = configuration.buildSessionFactory(serviceRegistry); 
    } 
    } 
} 

Найти код выше, и предложить, пожалуйста/комментарий, чтобы подтвердить правильность code.I думать продевал будет позаботиться об использовании этого. Я добавляю двойную проверку, чтобы избежать множественного создания сессии.

+0

Я также опубликовал мой класс singleton. Дело в том, что проблема с потоками. Я слышал, что SessionFactory является потокобезопасным. –

+0

Назначение Класс Impl - это то, о чем говорят ..? Я не думаю, что это SingleTon. Я думаю, что он создает sessionfactory каждый раз, когда вы вызываете getSessionFactory(). Не могли бы вы помочь мне или исправить меня .. –

+0

Я говорю о классе SessionFactoryBuilder. В моем вопросе я упомянул, что я создал его, даже если я его не использую. –

Смежные вопросы