为什么在Hibernate中每个数据库只有一个sessionFactory对象?
在这里,我们可以解释一下什么是SessionFactory。
• SessionFactory是一个接口,位于“org.hibernate”包中。
• Session Factory是一个长寿命多线程对象。
• 通常应该为一个数据库创建一个SessionFactory。
• 当您的应用程序中有多个数据库时,应创建多个SessionFactory对象。
• 假设您的应用程序中使用了一个名为mysql的数据库,则以下是创建SessionFactory对象的方法:
Configuration cfg = new Configuration(); //将创建一个空对象。
cfg = cfg.configure();
在调用configure()方法时,它会查找hibernate-cfg.xml和填充所有在配置文档和映射文档中定义的属性的Hibernate映射文件。
SessionFactory sc = cfg.buildSessionFactory();
• SessionFactory对象将被创建一次,并将由多个用户长时间使用。
• Session Factory对象是session对象的工厂。
如果您的hibernate应用程序中使用两个名为mysql和oracle的数据库,则需要构建2个SessionFactory对象:
Configuration cfg = new Configuration();
Configuration cfg1 = cfg.configure(“mysql.cfg.xml”);
SessionFactory sf1 = cfg1.buildSessionFactory();
Configuration cfg2 = cfg.configure(“oracle.cfg.xml”);
SessionFactory sf2 = cfg2.buildSessionFactory();
当我们在应用程序中使用多个数据库时,我们使用基于单例设计模式实现的HibernateUtil类,以确保为整个应用程序创建一个且仅一个sessionFactory对象。SessionFactory对象使用单例设计模式进行实现。SessionFactory的实例是线程安全的,并且通常在整个应用程序中共享。因为创建SessionFactory是一个极其昂贵的过程,涉及解析Hibernate配置/映射属性并创建数据库连接池。创建数据库连接池需要建立数据库连接(即创建Connection对象),这具有由于定位DB服务器而带来的开销。因此,如果您为每个请求创建一个SessionFactory,则意味着您没有使用数据库连接池来服务您的请求。因此,创建多个实例会使我们的应用程序变得笨重。但是session对象不是线程安全的。所以简而言之是 - SessionFactory对象是应用程序级别的,而Session对象是客户端级别的。
SessionFactory
就足够了。只有当你有多个数据源时,拥有多个SessionFactory
bean 才会有优点。 - Sotirios Delimanolis