首页 > 解决方案 > Spring Boot - 摆脱 Hikari 数据源并使用 H2

问题描述

我想在 Spring Boot 应用程序中使用 H2 数据库。

这就是我在 application.properties 中的内容:

spring.datasource.name=testdb
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=whydoesthishavetobe
spring.datasource.password=sodifficult
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect

这是 build.gradle 文件中的相关行:

    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    runtimeOnly 'com.h2database:h2'

当我检查 H2 数据库的连接时,一切都很好。

但尽管如此,当我将新实体 POST 到应用程序中时,我没有看到在 H2 数据库中创建任何内容,并且正如我从日志中看到的那样,Hikari 数据源正在后台使用。

为什么 Spring 忽略 application.properties 文件而不使用 H2 数据源?如何强制它使用 H2 数据源?

这是 Spring Boot 2.3.4.RELEASE。

标签: javaspring-bootgradleh2hikaricp

解决方案


我猜您有多个数据源,并且 H2 以外的数据源默认自动连接。因为 Hirakicp 是连接池而不是数据库。你不需要摆脱 Hirakicp 而是将 h2 数据源设置为主

如果您有多个数据源,以下解决方案应该可以工作,

如果您配置了多个数据源 bean,则只是 spring 正在自动装配其他数据源以用作默认源。

在声明 H2 数据源 bean 时使用 @Primary 注释应该可以解决这个问题。使用此注释将强制 spring 将 datult 自动连接到 h2 数据源。

如果您没有为 H2 声明数据源 bean,但有其他数据源 bean,则需要声明 h2 bean 并使用 @primary 注释将其设置为主要。

注意 - Hirakicp 是一个 db 连接对象而不是一个 db 。

例子 -

    @Bean("one")
    public BasicDataSource dataSourceOne() {
        BasicDataSource basicDataSource = new BasicDataSource();
        basicDataSource.setUrl(env.getProperty("spring.a.connectionUrl"));
        basicDataSource.setDriverClassName(env.getProperty("spring.a.DriverClass"));
        basicDataSource.setUsername(env.getProperty("spring.a.username"));
        basicDataSource.setPassword(env.getProperty("spring.a.password"));
        //  basicDataSource.setMaxActive(2);
        return basicDataSource;

    }

    @Primary
    @Bean("two")
    public BasicDataSource dataSourceTwo() {
        BasicDataSource basicDataSource = new BasicDataSource();
        basicDataSource.setUrl(env.getProperty("spring.u.connectionUrl"));
        basicDataSource.setDriverClassName(env.getProperty("spring.u.DriverClass"));
        basicDataSource.setUsername(env.getProperty("spring.u.username"));
        basicDataSource.setPassword(env.getProperty("spring.u.password"));
        return basicDataSource;

    }

推荐阅读