基于Hibernate的Java应用程序中,为单个数据库创建多个会话工厂对象。

4
我的问题很简单。当我在StackOverFlow上搜索时,会得到几个答案。但是实际上我对它们并不满意。
问题:在Hibernate中,我们可以创建多个sessionFactory吗? 回答:是的,我们可以创建多个。因为在我的应用程序中我能够这样做。
现在问题是,为什么我们不应该在一个应用程序中创建多个sessionFactory?有多个sessionFactory的优缺点是什么?
谢谢大家。

5
如果你只有一个数据源,那么只需要一个 SessionFactory 就足够了。只有当你有多个数据源时,拥有多个 SessionFactory bean 才会有优点。 - Sotirios Delimanolis
1
如果我们为单个数据库拥有多个SessionFactory,会有什么缺点? - Deepak Agrawal
3
浪费的记忆。你可以用一个对象做多个对象可以做的任何事情。 - Sotirios Delimanolis
如果这是真的,那么Hibernate团队的目的是什么,不将其作为单例模式呢? - Deepak Agrawal
1
为什么单例模式是有害的。它们通常在上下文范围内是单例的。 - Sotirios Delimanolis
显示剩余2条评论
3个回答

4
为什么在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对象是客户端级别的。

请仔细阅读它。 - Ashish Agrawal Yodlee

0

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


0
当您的应用程序中使用多个数据库实例时,您将需要多个hibernet.cfg.xml文件(如果您使用基于xml的配置),在每个hibernet.cfg.xml文件中,您将需要指定单独的标签,其中包含数据库配置。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接