2016-03-28 2 views
4

Наше приложение позволяет нашему клиенту иметь несколько баз данных, работающих на одном экземпляре сервера базы данных.Как использовать Hibernate с несколькими базами данных на одном сервере

Например, базы данных могут быть dbcommon, dbLive, dbStaging, dbUAT, dbDev, dbSandbox. Общая база данных и база данных Production всегда существуют, но остальные необязательны (и нет ограничений). В dbcommon есть таблица, которая сообщает нам все базы данных .... так вот, где мне нужно будет начинать. Общие таблицы отличаются от других, а остальные все имеют одну и ту же схему (данные подписчика)

Использование Hibernate, как я могу динамически создавать/использовать соединение с Live или Staging (или любым другим) ? Я использую Spring, если это помогает.

Я столкнулся с ответами, которые предполагают создание разных подключений в конфигурации, но поскольку количество баз данных подписчиков может меняться (за установку, а не во время работы приложения), это не вариант для меня.

+0

Я должен сделать это в приложении, которое у меня есть. Хотя я использую Spring и репозитории. Я мог бы так объяснить. – kevingreen

+0

Для меня Spring управляет соединениями, и он работает через профиль. Профиль определяет test-stage-prod и т. Д. У меня есть 3 базы данных, которые необходимо подключить в любой момент времени.Мне приходится менять среду, и 3 базы данных должны указывать в другом месте. Я могу показать вам свою конфигурацию, но если вы не используете Spring, это может быть не очень полезно. Он реализует JPA над Hibernate, поэтому это может привести к некоторым идеям. – kevingreen

+0

Мы также используем шаблон хранилища. После публикации вопроса я столкнулся с документацией Hibernate Multi Tenancy documentation ... Я вижу, будет ли это работать. –

ответ

1

Как я узнал после публикации этого вопроса, и, как предложил пользователь, поддержка Hibernate Multi Tenancy (с использованием базы данных 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"

Я все еще ищу способ, чтобы иметь возможность ссылаться на общий (общий) базы данных, в то же время, как базы данных арендатора ... и будет попытайтесь добавить это к этому ответу после завершения.

+1

Вы можете использовать два 'SessionFactory'. Один для общей базы данных, который использует инфраструктуру Hibernate по умолчанию, а другой для другой базы данных, которая использует поддержку нескольких арендаторов. – manish

0

Простейший способ, которым я могу это сделать, - управлять всем через профили весной.

Я выполнил это с помощью application.yml. Я также использую пул соединений Hikari, но это не слишком сильно влияет на конфигурацию.

Ниже приведен пример приложения.yml с тремя указанными профилями, и я определил два из них в качестве примера.

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 

В моем DB класс конфигурации, я поставил репозиториев JPA, и сказать ему, что EntityManager использовать. Я также настраиваю свойства конфигурации, чтобы вытащить файл application.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; 
    } 

    } 

Сущности и хранилища определяются нормально, там нет ничего особенного. БД переключит соединение на основе любого профиля, который я скажу ему для запуска.

Я просто выключаю профиль active в application.yml в зависимости от того, что мне нужно.

Указание по технике безопасности: определение профиля производства, не имеющее производства в качестве профиля по умолчанию.

+0

У нас есть 100 установок, и я не думаю, что это сработает для нас (управление каждым клиентом устанавливается локально и его изменение, чтобы приложение могло работать для них при установке). –

+0

Прогетами создавайте DataSource и диспетчер сущностей. Вам все равно нужно настроить один источник данных для установки, чтобы указать на таблицу с именами баз данных. Этот исходный DataSource может быть в application.yml. – kevingreen

Смежные вопросы