Java Hibernate:使用“SessionFactory”的最佳方式`
我正在用纯JSP、Servlet和Hibernate开发一个web应用程序。最近几天,我在使用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
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:好的,我将使它成为线程安全的。