Java Hibernate:使用“SessionFactory”的最佳方式`

Java Hibernate:使用“SessionFactory”的最佳方式`,java,hibernate,sessionfactory,Java,Hibernate,Sessionfactory,我正在用纯JSP、Servlet和Hibernate开发一个web应用程序。最近几天,我在使用Hibernate的SessionFactory时遇到了问题,不知道实现它的最佳方法。在不同的地方,开发人员声称应用程序应该有一个SessionFactory。因此,我创建了一个如下所示的单例类 package dao; import org.hibernate.SessionFactory; import org.hibernate.boot.registry.StandardServiceRegi

我正在用纯JSP、Servlet和Hibernate开发一个web应用程序。最近几天,我在使用
Hibernate
SessionFactory
时遇到了问题,不知道实现它的最佳方法。在不同的地方,开发人员声称应用程序应该有一个
SessionFactory
。因此,我创建了一个如下所示的单例类

package dao;

import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;

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

    private SessionFactoryBuilder()
    {
        buildConfig();
    }

    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();

         }
      return instance;
    }

    public SessionFactory getSessionFactory()
    {
        return sessionFactory;
    }
}
下面是一个使用SessionFactoryBuilder的类

public class AgentImpl implements AgentInterface
{
    SessionFactoryBuilder sessionFactory = SessionFactoryBuilder.getInstance();

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

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

    @Override
    public void save(Agent entity, Session session) {
        session.save(entity);
    }

    @Override
    public void update(Agent entity, Session session) {
        session.update(entity);
    }
 }

现在我的问题是,这是使用
会话工厂的最佳方式吗?这听起来可能是一个愚蠢的问题,但当您考虑servlet中的多线程行为时,就不会这样了,
驱动程序#连接错误
的发生是因为会话工厂的使用不正确,实现单例模式的各种方法等等。请给我你的建议

你的单件不是线程安全的。这是必须的。阅读无数解释如何编写线程安全单例的帖子。@JBNizet:谢谢你的回复。我没有使它成为线程安全的,因为“SessionFactory”是线程安全的。SessionFactory是线程安全的这一事实并不能阻止线程不安全的singleton创建SessionFactory的两个实例。@jbnitet:好的,我将使它成为线程安全的。