当前位置: 首页 > 知识库问答 >
问题:

多数据库应用SpringBoot、Hibernate和JPA

孙梓
2023-03-14

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

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

我所做的是使用spring boot profile特性选择正确的数据库profile,然后加载相关的数据库属性。

## 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
spring.profiles.active=h2

共有1个答案

长孙阳焱
2023-03-14

既然您已经为每个不同的DBs定义了不同的配置文件,为什么不创建一个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() {
        ...
    }
    ...
}
@Service
public class ConsumerService {

    @Autowired
    public IAdvancedQuery advancedQuery;

    ...

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

    ...
}
 类似资料:
  • 问题内容: 有人知道如何在hibernate配置中添加另一个数据源,以及如何在自己的DAO中将Spring配置为其自动注入该数据源吗? 这是我的带有一个数据源的代码,可以完美运行,但是我不知道如何添加另一个数据源。我想添加另一个数据源,该数据源是具有与实际数据库不同的表的数据库。 DAO EXAMPLE 问题答案: 我假定你有一组应使用的DAO的和适当的,而其他人应该使用不同的和基于。当然,你需要

  • 问题内容: 我有一个Spring + Hibernate + JPA应用程序。用户登录时,可以从要连接的数据库列表中进行选择(这是要求)。所有数据库都有相同的架构,因此将使用相同的实体和DAO。 现在,我有一个EntityManager(目前正在使用一个数据库),它被注入到DAO中,如下所示: 有什么方法可以让DAO根据从服务层接收到的参数/属性自动接收entityManager(由Spring管

  • 我正在尝试使用两个数据源与我的SpringBoot应用程序,但无法获得第二个数据源自动连接。我尝试过很多事情,但这是我最接近的一次: 我的Yaml文件: 这是我到目前为止最接近的一次。我之所以说它是最接近的,是因为如果我删除@qualifier,那么我的两个dao方法实际上都可以工作,假设SECOND_SELECT语句对于我的DB1是有效的SQL语句。当我为非主datasouce输入@Qualif

  • 问题内容: 我正在尝试配置Spring + Hibernate + JPA以使用两个数据库(MySQL和MSSQL)。 我的datasource-context.xml: 每个persistence.xml包含一个单元,如下所示: PersistenceUnitManager导致以下异常: 如果只留下一个没有列表的persistence.xml,则每个列表都可以正常工作,但我需要2个单元… 我还尝

  • 这是我的配置属性文件。 应用程序.属性 如果能提供一些非常好的建议来执行它,我将不胜感激。你在这方面的知识对我有帮助,谢谢。

  • 我们的应用程序是一个中间层应用程序,它提供了十几个左右的前端应用程序,可以访问后端的几十个数据库(和其他数据源)。 我们决定使用OSGi将不相关的代码位分离到单独的包中。这确保了正确的代码封装,甚至允许特定捆绑包的热交换。 这样做的一个优点是,与特定数据库对话的任何代码都被隔离到单个捆绑包中。它还允许我们简单地为新的目的地插入新的捆绑包,并无缝地集成新代码。它还确保了如果单个后端数据源关闭,对其他