【问题标题】:Multiple DataBase Application SpringBoot , Hibernate and JPA多数据库应用 SpringBoot , Hibernate 和 JPA
【发布时间】:2019-08-09 15:45:13
【问题描述】:

我需要一个概念来设计一个使用 Spring boot、Hibernate 和 JPA 的多数据库应用程序。

目前我正在考虑支持 4 个关系数据库(Mysql、H2、SQLLite、Oracle)。

我正在做的是使用 spring boot 配置文件功能选择正确的数据库配置文件,然后加载相关的数据库属性。

## application-h2.properties
## Spring DATASOURCE (DataSourceAutoConfiguration & DataSourceProperties)
spring.datasource.url=jdbc:h2:file:~/test
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.h2.console.enabled=true
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.H2Dialect

# application-mysql.properties
# MySQL-Database
#spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/ntk?autoReconnect=true&useSSL=false
spring.datasource.username=root
spring.datasource.password=root
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect

然后在 application.properties 中

spring.profiles.active=h2

在这里,应用程序将运行并加载 h2 数据库的属性。同样我们可以选择配置文件作为 Mysql,它将加载 Mysql 相关属性。

在这里,几乎每个查询都是由 JPA 基于方言生成的。它与所有数据库兼容(因为,有时我们会根据所选配置文件为一个数据库运行此应用程序)。但是,我担心的是,如果需要手动编写一些复杂的查询,我如何才能使其兼容其他数据库。假设某些为 Mysql 设计的查询可能与 Oracle 不兼容。

任何人都可以根据我给出的描述提出一些方法,如果需要其他信息,请告诉我。

【问题讨论】:

  • “但是,我担心的是,如果一些复杂的查询需要手动编写,我如何使它与其他数据库兼容” 非常大的问题,这很可能需要SQL transpiler
  • @RaymondNijland 方法对您来说看起来不错?请建议。或任何其他不需要 SQL 转译器的方式。
  • 我想如果你编写 MySQL 代码 SELECT MD5(..) 并且你需要它用于 SQL Server (MSSQL) 它将是 SELECT HASHBYTES('md5', ..) 这是一个简单的源到源转换,对于更难的事情,您还必须用 PHP 或 SQL 编写解释器来处理其他 RDMS 可能支持的更复杂的情况。..
  • @RaymondNijland 这对我来说看起来很复杂。在检测我们正在为使用本机 sql 或类似的东西不兼容的数据库生成查询特定的配置文件时会怎么样??
  • “对我来说它看起来很复杂。” 是的,为什么你认为大多数框架都保持 ANSI/ISO SQL 标准或支持一个 RDMS 系统...问题开始于您需要使用 SQL 方言(特定供应商扩展)

标签: java spring hibernate spring-boot spring-data-jpa


【解决方案1】:

鉴于您已经为每个不同的数据库定义了不同的配置文件,为什么不创建一个 bean 来封装所有这些“更高级”的查询并使用@profile 对其进行注释,以便根据所选配置文件实际使用正确的配置文件?

创建一个接口,为您可能需要的每个高级查询声明一个方法:

public interface IAdvancedQuery {
    void advancedQuery1();
    void advancedQuery2();
     ...  
}

然后,为每个配置文件创建一个实现此接口的 bean 并相应地对其进行注释:

@Profile("h2")
@Component
public class H2Queries implements IAdvancedQuery {
    @Override
    public void query1() {
        // your h2 specific query goes here
    }
    @Override
    public void query2() {
        ...
    }
    ...
}

@Profile("mysql")
@Component
public class MysqlQueries implements IAdvancedQuery {
    @Override
    public void query1() {
        // your mySQL specific query goes here
    }
    @Override
    public void query2() {
        ...
    }
    ...
}

最后,假设您有一个消费者服务类,您只需使用 @Autowired 注入适当的 bean,根据您在 spring 应用中指定的配置文件自动注入:

@Service
public class ConsumerService {

    @Autowired
    public IAdvancedQuery advancedQuery;

    ...

    public void someMethod() {
       // do something with the advanced query
       advancedQuery.query1();
       ...
    }

    ...
}

最终将根据配置文件和实例化的 bean 选择正确的“高级查询”方法。

【讨论】:

    猜你喜欢
    • 2010-12-26
    • 2012-01-31
    • 1970-01-01
    • 1970-01-01
    • 2019-06-19
    • 2021-07-12
    • 1970-01-01
    • 1970-01-01
    • 2018-03-15
    相关资源
    最近更新 更多