英文:
Spring Boot - Get rid of Hikari Data Source and use 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版本。
英文:
I would like to use an H2 database in a Spring Boot application.
This is what I have in 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
This are the relevant lines in the build.gradle file:
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
runtimeOnly 'com.h2database:h2'
When I check the connection for the H2 database, it's all good.
But despite this, when I POST new entities into the application, I see nothing getting created in the H2 database, and Hikari data source is getting used instead in the background, as I see from the logs.
Why is Spring ignoring the application.properties file and not using the H2 data source? How can I force it to use the H2 data source?
This is Spring Boot 2.3.4.RELEASE.
答案1
得分: 1
我猜你有多个数据源,并且除了 H2 之外还有另一个数据源被自动装配为默认数据源。因为 Hirakicp 是一个连接池而不是数据库,所以你不需要摆脱 Hirakicp,而是将 H2 数据源设置为主要数据源。
如果你有多个数据源配置,以下解决方案应该适用:
如果你配置了多个数据源 bean,只是 Spring 自动装配了其他数据源作为默认源。
在声明 H2 数据源 bean 时使用 @Primary 注解应该可以解决这个问题。使用这个注解会强制 Spring 自动装配默认到 H2 数据源。
如果你没有为 H2 声明数据源 bean,但有其他数据源 bean,你需要声明 H2 数据源 bean 并使用 @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;
}
英文:
I guess you have multiple datasources and a datasource other tha H2 is being autowired as default.As Hirakicp is a connection pool not a db.
U need not get rid of Hirakicp rather set h2 datasources as primary
The below solution should work if you have multiple datasources ,
If you have multiple data source beans configured, it's just that spring is autowiring other data source to be used as a default source.
using @Primary annotation while declaring H2 Datasource bean should solve this.
Using this annotation will force spring to autowire the datult to h2 datasource.
in case you have not declared a datasource bean for H2 but have other datasource beans, you will need to declare the h2 bean and set it as primary using @primary annotation.
note - Hirakicp is a db connection object not a db .
Example -
@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;
}
答案2
得分: 0
我认为这是因为SpringBoot应用程序创建了自己的内存嵌入式数据库,而您的数据库客户端也创建了自己的内存嵌入式数据库。
我建议您将数据库从内存更改为文件系统,并查看应用程序和数据库客户端是否显示相同的数据。
spring.datasource.url=jdbc:h2:file:/data/sample/testdb
您只需要更改数据库的URL,使其成为基于文件的数据库。
如果您希望继续使用内存方法,您可以通过TCP连接到它,以便应用程序和客户端都可以使用同一个数据库。
spring.datasource.url=jdbc:h2:tcp://localhost/mem:testdb
英文:
I think this is happening because SpringBoot application creates its own in-memory embedded database while your database client creates its own in-memory embedded database.
I suggest you to change the database from in-memory to filesystem and see if the application and your database client shows the same data.
spring.datasource.url=jdbc:h2:file:/data/sample/testdb
You only need to change the database url to make it a file based database.
If you need to proceed with in-memory approach, you can connect to that via tcp so that both your application and client can use the same database.
spring.datasource.url=jdbc:h2:tcp://localhost/mem:testdb
答案3
得分: 0
什么是“为什么Spring忽略application.properties文件,而不使用H2数据源”的意思?Hikari 是连接池,不是数据源。如果您想要提供自己的数据源,您必须注入一个带有您感兴趣的配置的Bean。
连接池 连接池是维护的数据库连接缓存,以便在将来需要向数据库发出请求时可以重用这些连接。
数据源 是运行报表或获取信息所使用的数据的来源。
在这里查看有关连接池的更多信息:https://www.baeldung.com/java-connection-pooling
但是,如果您不喜欢日志记录,您可以使用 org.zaxxer.hikari=error
将日志记录器设置为错误。
英文:
What do you mean by Why is Spring ignoring the application.properties file and not using the H2 data source? Hikari is connection pool, not a datasource. If you would like to provide your own datasource, you have to inject a bean with the configuration of your interest.
Connection pool A connection pool is a cache of database connections maintained so that the connections can be reused when future requests to the database are required.
Datasource Is where data that is being used to run a report or gain information is originating from.
Check here for more on connection pools: https://www.baeldung.com/java-connection-pooling
But, if it the logging that you don't like, you can set the logger to error with org.zaxxer.hikari=error
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论