java - 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。
解决方案
我猜您有多个数据源,并且 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;
}
推荐阅读
- python - 如何在 Python ftplib 中检查 FTP 登录是否成功?
- spring - @Value 在运行 webApp 时工作正常,但 maven 构建失败,无法解析占位符 'property.push.url' in value "${property.push.url}"
- c - void 指针 - 从闪存加载结构
- c# - 将SQL查询结果反序列化为动态对象c#
- c# - 使用列表框显示跨不同类的列表
- php - 如何在 php json_encode 之前正确转义格式错误的 json 输入中的双引号
- typescript - Vue Router 元字段
- python - ImportError:ubuntu 中没有名为 pytesseract 的模块
- c# - 随机化关于种子数的对象列表
- android - 当用户从网站上删除数据时更新移动应用程序 - Xamarin 表单