Как поддерживать несколько движков баз данных на Spring? - PullRequest
0 голосов
/ 04 ноября 2018

Я создаю приложение Spring Boot, которое должно поддерживать различные механизмы баз данных (MySQL, PostgreSQL, Oracle, SQL Server).

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

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

У вас есть какой-нибудь ресурс, который указывает мне правильное направление?

Большое спасибо !!!

Ответы [ 3 ]

0 голосов
/ 05 ноября 2018

Вы можете определить различные соединения и получить их с помощью определенных методов

private DataSource mySqlDataSource;
private DataSource postgresDataSource;

public Connection getMySqlConnection() throws SQLException {
   mySqlDataSource.getConnection();
}
public Connection getPostgresConnection() throws SQLException {
   postgresDataSource.getConnection();
}
0 голосов
/ 05 ноября 2018

Вы можете обратиться образец. В примере я использую hibernate + spring boot для нескольких баз данных. Вы можете работать следующим образом:

Шаг 1: вы объявляете в application.properties info connect базы данных (mysql, oracle, postgresql)

# MySQL-Database
mysql.db.driver: com.mysql.jdbc.Driver
mysql.db.url: jdbc:mysql://localhost:3306/test
mysql.db.username: root
mysql.db.password: root
mysql.hibernate.dialect: org.hibernate.dialect.MySQL5Dialect
mysql.entitymanager.packagesToScan: com.test.mysql


# postgresql-Database
postgresql.db.driver: org.postgresql.Driver
postgresql.db.url: jdbc:postgresql://localhost:5432/postgres_demo
postgresql.db.username: root
postgresql.db.password: 
postgresql.hibernate.dialect: org.hibernate.dialect.PostgreSQLDialect
postgresql.entitymanager.packagesToScan: com.test.postgresql


# Oracle-Database
oracle.db.driver: oracle.jdbc.driver.OracleDriver
oracle.db.url: jdbc:oracle:thin:@localhost:1521:xe
oracle.db.username: root
oracle.db.password: 
oracle.hibernate.dialect: org.hibernate.dialect.Oracle10gDialect
oracle.entitymanager.packagesToScan: com.test.oracle

Шаг 2: При весенней загрузке проекта вы можете ссылаться на структуру проекта, такую ​​как:

enter image description here

Шаг 3: Реализация источника данных для mysql, oracle, postgresql. вы можете ссылаться на MysqlDatabaseConfig.java, OracleDatabaseConfig.java, PostgresDatabaseConfig.java

package com.test.mysql;

import java.util.Properties;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.orm.hibernate4.HibernateTransactionManager;
import org.springframework.orm.hibernate4.LocalSessionFactoryBean;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@Configuration
@EnableTransactionManagement
public class MysqlDatabaseConfig {

  @Value("${mysql.db.driver}")
  private String DB_DRIVER;

  @Value("${mysql.db.password}")
  private String DB_PASSWORD;

  @Value("${mysql.db.url}")
  private String DB_URL;

  @Value("${mysql.db.username}")
  private String DB_USERNAME;

  @Value("${mysql.hibernate.dialect}")
  private String HIBERNATE_DIALECT;

  @Value("${mysql.entitymanager.packagesToScan}")
  private String ENTITYMANAGER_PACKAGES_TO_SCAN;

  @Bean(name="mysqlDataSource")
  @Primary
  public DataSource cmrDataSource() {
    DriverManagerDataSource dataSource = new DriverManagerDataSource();
    dataSource.setDriverClassName(DB_DRIVER);
    dataSource.setUrl(DB_URL);
    dataSource.setUsername(DB_USERNAME);
    dataSource.setPassword(DB_PASSWORD);
    return dataSource;
  }

  @Bean(name="mysqlSessionFactory")
  public LocalSessionFactoryBean crmSessionFactory() {
    LocalSessionFactoryBean sessionFactoryBean = new LocalSessionFactoryBean();
    sessionFactoryBean.setDataSource(cmrDataSource());
    sessionFactoryBean.setPackagesToScan(ENTITYMANAGER_PACKAGES_TO_SCAN);
    Properties hibernateProperties = new Properties();
    hibernateProperties.put("hibernate.dialect", HIBERNATE_DIALECT);
    sessionFactoryBean.setHibernateProperties(hibernateProperties);

    return sessionFactoryBean;
  }

  @Bean(name="mysqlTransactionManager")
  public HibernateTransactionManager transactionManager() {
    HibernateTransactionManager transactionManager =  new HibernateTransactionManager();
    transactionManager.setSessionFactory(crmSessionFactory().getObject());
    return transactionManager;
  }

}

OracleDatabaseConfig.java

package com.test.oracle;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.orm.hibernate4.HibernateTransactionManager;
import org.springframework.orm.hibernate4.LocalSessionFactoryBean;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import javax.sql.DataSource;
import java.util.Properties;

@Configuration
@EnableTransactionManagement
public class OracleDatabaseConfig {

  @Value("${oracle.db.driver}")
  private String DB_DRIVER;

  @Value("${oracle.db.password}")
  private String DB_PASSWORD;

  @Value("${oracle.db.url}")
  private String DB_URL;

  @Value("${oracle.db.username}")
  private String DB_USERNAME;

  @Value("${oracle.hibernate.dialect}")
  private String HIBERNATE_DIALECT;

  @Value("${oracle.entitymanager.packagesToScan}")
  private String ENTITYMANAGER_PACKAGES_TO_SCAN;

  @Bean(name="oracleDataSource")
  @Primary
  public DataSource cmrDataSource() {
    DriverManagerDataSource dataSource = new DriverManagerDataSource();
    dataSource.setDriverClassName(DB_DRIVER);
    dataSource.setUrl(DB_URL);
    dataSource.setUsername(DB_USERNAME);
    dataSource.setPassword(DB_PASSWORD);
    return dataSource;
  }

  @Bean(name="oracleSessionFactory")
  public LocalSessionFactoryBean crmSessionFactory() {
    LocalSessionFactoryBean sessionFactoryBean = new LocalSessionFactoryBean();
    sessionFactoryBean.setDataSource(cmrDataSource());
    sessionFactoryBean.setPackagesToScan(ENTITYMANAGER_PACKAGES_TO_SCAN);
    Properties hibernateProperties = new Properties();
    hibernateProperties.put("hibernate.dialect", HIBERNATE_DIALECT);
    sessionFactoryBean.setHibernateProperties(hibernateProperties);

    return sessionFactoryBean;
  }

  @Bean(name="oracleTransactionManager")
  public HibernateTransactionManager transactionManager() {
    HibernateTransactionManager transactionManager =  new HibernateTransactionManager();
    transactionManager.setSessionFactory(crmSessionFactory().getObject());
    return transactionManager;
  }

}

PostgresDatabaseConfig.java

package com.test.postgresql;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.orm.hibernate4.HibernateTransactionManager;
import org.springframework.orm.hibernate4.LocalSessionFactoryBean;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import javax.sql.DataSource;
import java.util.Properties;

@Configuration
@EnableTransactionManagement
public class PostgresDatabaseConfig {

  @Value("${postgresql.db.driver}")
  private String DB_DRIVER;

  @Value("${postgresql.db.password}")
  private String DB_PASSWORD;

  @Value("${postgresql.db.url}")
  private String DB_URL;

  @Value("${postgresql.db.username}")
  private String DB_USERNAME;

  @Value("${postgresql.hibernate.dialect}")
  private String HIBERNATE_DIALECT;

  @Value("${postgresql.entitymanager.packagesToScan}")
  private String ENTITYMANAGER_PACKAGES_TO_SCAN;

  @Bean(name="postgresqlDataSource")
  @Primary
  public DataSource cmrDataSource() {
    DriverManagerDataSource dataSource = new DriverManagerDataSource();
    dataSource.setDriverClassName(DB_DRIVER);
    dataSource.setUrl(DB_URL);
    dataSource.setUsername(DB_USERNAME);
    dataSource.setPassword(DB_PASSWORD);
    return dataSource;
  }

  @Bean(name="postgresqlSessionFactory")
  public LocalSessionFactoryBean crmSessionFactory() {
    LocalSessionFactoryBean sessionFactoryBean = new LocalSessionFactoryBean();
    sessionFactoryBean.setDataSource(cmrDataSource());
    sessionFactoryBean.setPackagesToScan(ENTITYMANAGER_PACKAGES_TO_SCAN);
    Properties hibernateProperties = new Properties();
    hibernateProperties.put("hibernate.dialect", HIBERNATE_DIALECT);
    sessionFactoryBean.setHibernateProperties(hibernateProperties);

    return sessionFactoryBean;
  }

  @Bean(name="postgresqlTransactionManager")
  public HibernateTransactionManager transactionManager() {
    HibernateTransactionManager transactionManager =  new HibernateTransactionManager();
    transactionManager.setSessionFactory(crmSessionFactory().getObject());
    return transactionManager;
  }

}

Шаг 4: позвоните, чтобы использовать: в случае mysql

package com.test.mysql.dao;

import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

@Repository
@Transactional("mysqlTransactionManager")
public class TestMysqlDao {
    @Autowired
    @Qualifier("mysqlSessionFactory")
    private SessionFactory sessionFactory;
}

В случае оракула

package com.test.oracle.dao;

import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

@Repository
@Transactional("oracleTransactionManager")
public class TestOracleDao {
    @Autowired
    @Qualifier("oracleSessionFactory")
    private SessionFactory sessionFactory;
}

В случае postgresql

package com.test.postgresql.dao;

import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

@Repository
@Transactional("postgresqlTransactionManager")
public class TestPostgresDao {
    @Autowired
    @Qualifier("postgresqlSessionFactory")
    private SessionFactory sessionFactory;
}
0 голосов
/ 05 ноября 2018

Непонятно, что вы подразумеваете под установкой, но если вы хотите, чтобы ваше приложение запускалось с разных баз данных, вы можете использовать разные профили Spring с вашими application.yml загрузочными профилями Spring

---

spring:
    profiles: postgres
  datasource:
    url: 
    username: 
    password:
    driver-class-name: org.postgresql.Driver
---

spring:
  profiles: mysql
  datasource:
    url: 
    username: 
    password:
    driver-class-name: com.mysql.jdbc.Driver

Затем вы можете запустить приложение с соответствующим профилем

java -jar -Dspring.profiles.active=mysql yourapp.jar
...