如何在Spring上支持多个数据库引擎?

时间:2018-11-04 20:28:38

标签: spring spring-boot database-connection

我正在构建一个Spring Boot应用程序,该应用程序应支持各种数据库引擎(MySQL,PostgreSQL,Oracle,SQL Server)。

在安装应用程序时,系统将提示用户选择要使用的数据库,然后将创建所有表。我认为我应该将用户选项保存在某个地方,然后使用它来选择应用程序实例化存储库的正确引擎。

我通过谷歌搜索了一些参考资料或最佳做法,以实现此目的,但我找不到这些信息或最佳做法(也许我搜索的字词错误-抱歉)。

您有什么资源可以指引我正确的方向吗?

非常感谢!

3 个答案:

答案 0 :(得分:2)

您可以参考样本。在示例中,我将hibernate + spring boot用于多个数据库。 您可以通过以下方式工作:

步骤1:您在application.properties中声明数据库(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步:在项目Spring Boot中,您可以引用结构项目,例如:

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;
}

答案 1 :(得分:0)

目前尚不清楚安装的含义,但是如果您希望应用程序从不同的数据库启动,则可以在application.yml Spring boot profiles

中使用不同的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

答案 2 :(得分:0)

您可以定义不同的连接并使用特定的方法获取它们

private DataSource mySqlDataSource;
private DataSource postgresDataSource;

public Connection getMySqlConnection() throws SQLException {
   mySqlDataSource.getConnection();
}
public Connection getPostgresConnection() throws SQLException {
   postgresDataSource.getConnection();
}