基于hibernate的java应用程序中单个数据库的多个会话工厂对象

时间:2014-03-31 18:32:32

标签: java hibernate

我的问题非常简单。当我在StackOverFlow上搜索时,我得到了几个答案。但我真的不满意他们。

Q值。我们可以在Hibernate中创建多个sessionFactory。 Ans和它的真实我们可以创建。在我的应用程序中,我能够相同。

问:现在我们不应该在应用程序中创建多个会话工厂。 有多个会议工厂的优点和缺点是什么。

谢谢大家

3 个答案:

答案 0 :(得分:0)

始终建议每个JVM每个数据库有一个会话工厂。拥有多个会话工厂实例可能会导致性能问题以及事务的异常行为。

答案 1 :(得分:0)

为什么每个数据库在Hibernate中只有一个sessionFactory对象?

在这里我们可以解释什么是SessionFactory。

•SessionFactory是一个接口,可以在“ org.hibernate”包中使用。

•会话工厂是长寿命的多线程对象。

•通常应该为一个数据库创建一个会话工厂。

•当您的应用程序中有多个数据库时,应创建多个SessionFactory对象。

•假设您在应用程序中使用一个名为mysql的数据库,那么以下是创建SessionFactory对象的方法:

配置cfg = new Configuration(); //将创建空对象。

cfg = cfg.configure();

在这里调用configure()方法时,它将查找hibernate-cfg.xml和Hibernate映射文件,其中包含配置文件和映射文件中定义的所有属性。

SessionFactory sc = cfg.buildSessionFactory();

•SessionFactory对象将被创建一次,并将被多个用户长时间使用。 •会话工厂对象是会话对象的工厂。

如果您在休眠应用程序中使用名为mysql和oracle的两个数据库,则需要 构建2个SessionFactory对象:

配置cfg = new Configuration();

配置cfg1 = cfg.configure(“ mysql.cfg.xml”);

SessionFactory sf1 = cfg1.builed SessionFactory();

配置cfg2 = cfg.configure(“ oracle.cfg.xml”);

SessionFactory sf2 = cfg2.builed SessionFactory();

当我们在应用程序中使用多个数据库时,我们使用的是基于单例设计模式实现的HibernateUtil类,该类可确保为整个应用程序创建一个并且只有一个sessionFactory对象。使用单例设计模式实现。 SessionFactory的实例是线程安全的,通常在整个应用程序中共享。因为创建SessionFactory是一个非常昂贵的过程,涉及解析休眠配置/映射属性和创建数据库连接池。创建数据库连接池需要建立数据库连接(即创建Connection对象),这会花费大量时间来定位数据库。数据库服务器。因此,如果为每个请求创建一个SessionFactory,则意味着您没有使用数据库连接池来服务您的请求。因此,创建实例数将使我们的应用程序负担沉重。但是会话对象不是线程安全的。简而言之,它是-每个应用程序一个SessionFactory对象,每个客户端一个Session对象。

答案 2 :(得分:-1)

当您的应用程序中使用多个数据库实例时,您将需要多个hibernet.cfg.xml文件(如果您使用基于xml的配置),在每个hibernet.cfg.xml文件中,您将不得不提到单独的标记,这将是由数据库配置组成。

但是,除非有任何严格的业务要求或需要,否则我们不建议拥有多个会话工厂实例,因为它会降低应用程序性能。