Spring Boot-摆脱Hikari数据源并使用H2

时间:2020-10-27 06:44:04

标签: java spring-boot gradle h2 hikaricp

我想在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数据库的连接时,一切都很好。

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

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

这是Spring Boot 2.3.4.RELEASE。

3 个答案:

答案 0 :(得分:0)

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

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

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

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

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

注意-Hirakicp是数据库连接对象,而不是数据库。

示例-

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

    }

答案 1 :(得分:0)

我认为这是因为SpringBoot应用程序创建了自己的内存嵌入式数据库,而您的数据库客户端却创建了自己的内存嵌入式数据库。

我建议您将数据库从内存中更改为文件系统,并查看应用程序和数据库客户端是否显示相同的数据。

spring.datasource.url=jdbc:h2:file:/data/sample/testdb

您只需更改数据库URL即可使其成为基于文件的数据库。

如果需要继续使用内存中方法,则可以通过tcp连接到该方法,以便您的应用程序和客户端都可以使用同一数据库。

spring.datasource.url=jdbc:h2:tcp://localhost/mem:testdb

答案 2 :(得分:0)

您的意思是为什么Spring会忽略application.properties文件而不使用H2数据源? Hikari 是连接池,而不是数据源。如果要提供自己的数据源,则必须注入具有所需配置的bean。

连接池:连接池是维护的数据库连接的缓存,以便在将来需要对数据库的请求时可以重新使用连接。

数据源是用于运行报告或获取信息的数据的来源。

在此处查看有关连接池的更多信息:https://www.baeldung.com/java-connection-pooling

但是,如果您不喜欢该日志记录,则可以将记录器设置为org.zaxxer.hikari=error错误