【问题标题】:How to use Hibernate with multiple databases on a single server如何在单个服务器上使用 Hibernate 和多个数据库
【发布时间】:2016-07-16 04:07:05
【问题描述】:

我们的应用程序允许我们的客户拥有多个数据库,所有数据库都在数据库服务器的一个实例上运行。

例如,数据库可能是 dbcommon、dbLive、dbStaging、dbUAT、dbDev、dbSandbox。公共数据库和生产数据库始终存在,但其他数据库是可选的(并且没有限制)。在 dbcommon 中,有一个表告诉我们所有的数据库......所以我需要从那里开始。共同的表与其他表不同,并且其他表都具有相同的架构(订阅者数据)

使用 Hibernate,我如何动态创建/使用与 Live 或 Staging(或任何其他)的连接?如果有帮助,我正在使用 Spring。

我遇到过建议在配置中创建不同连接的答案,但由于订阅者数据库的数量可能会有所不同(每次安装,而不是在应用程序运行时),这对我来说不是一个选择。

【问题讨论】:

  • 我必须在我拥有的应用程序中执行此操作。我正在使用 Spring 和存储库进行管理。我可以这样解释。
  • 对我来说,Spring 处理连接,它通过配置文件运行。配置文件决定了测试阶段产品等。我有 3 个数据库需要在任何给定时间连接。我必须换出环境,并且 3 个数据库需要指向其他地方。我可以向您展示我的配置,但如果您不使用 Spring,它可能不会很有帮助。它正在通过 Hibernate 实现 JPA,因此可能会产生一些想法。
  • 我们也使用存储库模式。自从发布问题以来,我遇到了 Hibernate 的多租户文档页面......我正在看看这是否也可以。
  • 我最终会在 Hibernate 中使用 Spring JPA...所以这对我来说很好!
  • 好的,我需要几分钟才能写出来。

标签: java database spring hibernate


【解决方案1】:

正如我在发布此问题后发现的那样,并且正如用户 manish 所建议的那样,Hibernate 的多租户支持(使用数据库 MultiTenancyStrategy)对我有用。我不得不使用各种资源(如下所列)拼凑出一个解决方案。

http://www.ticnfae.co.uk/blog/2014/07/16/hibernate-multi-tenancy-with-spring/

Setting up a MultiTenantConnectionProvider using Hibernate 4.2 and Spring 3.1.1

Multi-Tenancy with Spring + Hibernate: "SessionFactory configured for multi-tenancy, but no tenant identifier specified"

我仍在寻找一种能够在引用租户数据库的同时引用公共(共享)数据库的方法......并在完成后尝试将其添加到此答案中。

【讨论】:

  • 您可以使用两个SessionFactorys。一个用于使用默认 Hibernate 基础架构的通用数据库,另一个用于使用多租户支持的其他数据库。
【解决方案2】:

我能看到的最简单的方法是通过 Spring 中的配置文件管理所有内容。

我通过使用 application.yml 实现了这一点。我也在使用 Hikari 连接池,但这对配置影响不大。

这是一个 application.yml 的示例,其中列出了 3 个配置文件,我已经定义了其中两个作为示例。

spring:
  profiles:
    include: dev,test,production
    active: dev
---
spring:
  profiles: dev
oms:
  omsDataSource:
    driverClassName: com.informix.jdbc.IfxDriver
    jdbcUrl: jdbc:informix-sqli://devdb:9000/hol:INFORMIXSERVER=m_tcp_1;client_deve=en_US.8859-1;db_deve=en_US.8859-1;LOBCACHE=-1
    password: oms
    username: oms
    connectionTestQuery: select count(*) from systables
    maximumPoolSize: 5

---
spring:
  profiles: test
oms:
  omsDataSource:
    driverClassName: com.informix.jdbc.IfxDriver
    jdbcUrl: jdbc:informix-sqli://testdb:9000/hol:INFORMIXSERVER=m_tcp_1;client_deve=en_US.8859-1;db_deve=en_US.8859-1;LOBCACHE=-1
    password: oms
    username: oms
    connectionTestQuery: select count(*) from systables
    maximumPoolSize: 5

在我的数据库配置类中,我设置了 JPA 存储库,并告诉它使用哪个 entityManager。我还设置了配置属性来拉取应用程序.yml。这意味着它将根据应用在启动时使用的配置文件交换详细信息。

@EnableJpaRepositories(entityManagerFactoryRef = "entityManagerFactoryOms",
        transactionManagerRef = "transactionManagerOms",
        basePackages= "persistence.oms")
@Configuration
@ConfigurationProperties(prefix = "oms.omsDataSource")
public class omsDbConfig extends HikariConfig {

//This will automatically fill in the required fields from the application.yml. 
    @Bean
    public HikariDataSource orcaDataSource() throws SQLException {
        return new HikariDataSource(this);
    }

//I use that datasource to define my entityMangerFactory
@Bean(name = "entityManagerFactoryOms")
    public LocalContainerEntityManagerFactoryBean entityManagerFactoryOrca() throws SQLException {
        JpaVendorAdapter adapter = new HibernateJpaVendorAdapter();
        Properties props = new Properties();
        props.setProperty("hibernate.dialect","org.hibernate.dialect.InformixDialect");
        LocalContainerEntityManagerFactoryBean emfb =
                new LocalContainerEntityManagerFactoryBean();
        emfb.setDataSource(orcaDataSource());
        emfb.setPackagesToScan("persistence.oms");
        emfb.setJpaProperties(props);
        emfb.setJpaVendorAdapter(adapter);
        return emfb;
    }

    }

实体和存储库是正常定义的,没有什么特别之处。数据库将根据我告诉它运行的任何配置文件切换连接。

我只是将 application.yml 中的 active 配置文件切换到我需要的任何一个。

安全注意事项:定义生产配置文件,不要将生产作为默认配置文件。

【讨论】:

  • 我们有 100 次安装,但我认为这对我们不起作用(管理每个客户在本地安装并进行更改,以便在安装时应用可以为他们工作)
  • 以编程方式构建数据源和实体管理器。您仍然需要在安装时设置一个 DataSource 以指向其中包含数据库名称的表。该初始数据源可能在 application.yml 中。
猜你喜欢
  • 2014-08-02
  • 1970-01-01
  • 2019-11-25
  • 1970-01-01
  • 2023-03-12
  • 2013-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多