我想在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。
答案 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
错误