Spring Boot多数据源下为所有Hikari连接池设置auto-commit为false
根因说明
Spring Boot 自带的数据源自动配置仅会处理前缀为spring.datasource的主数据源,读取其下的连接池相关配置。你自定义的spring.batch-datasource前缀的第二数据源没有对应的自动配置逻辑,所以你设置的spring.batch-datasource.auto-commit=false不会生效,该数据源会使用Hikari连接池的默认值autoCommit=true,这就是你日志中看到第二个连接池配置不生效的原因。
你提到的.type(HikariDataSource.class)属于代码层面的改动,作用是指定手动构建的数据源实现类为Hikari连接池,方便后续绑定配置文件中的连接池属性。
配置修改步骤
1. 修正application.properties配置
多数据源场景下,Hikari连接池的专属配置需要统一放在hikari前缀下,同时可以通过pool-name属性自定义连接池名称:
# 主数据源配置 spring.datasource.url=${BLUECOST_DATASOURCE_URL} spring.datasource.username=${BLUECOST_DATASOURCE_USERNAME} spring.datasource.password=${BLUECOST_DATASOURCE_PASSWORD} spring.datasource.driver-class-name=${BLUECOST_DATASOURCE_DRIVER} # 主数据源Hikari配置 spring.datasource.hikari.auto-commit=false spring.datasource.hikari.pool-name=BluecostHikariPool # 批处理数据源配置 spring.batch-datasource.url=${BATCH_DATASOURCE_URL} spring.batch-datasource.username=${BATCH_DATASOURCE_USERNAME} spring.batch-datasource.password=${BATCH_DATASOURCE_PASSWORD} spring.batch-datasource.driver-class-name=${BATCH_DATASOURCE_DRIVER} # 批处理数据源Hikari配置 spring.batch-datasource.hikari.auto-commit=false spring.batch-datasource.hikari.pool-name=BatchHikariPool # JPA公共配置保持不变 spring.jpa.database-platform=DB2 spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.DB2Dialect spring.jpa.properties.hibernate.default_schema=${cost.rules.schema}
2. 新增数据源注册代码
手动创建两个数据源的Bean,将配置文件中的属性绑定到对应数据源上:
import com.zaxxer.hikari.HikariDataSource; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.jdbc.DataSourceBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import javax.sql.DataSource; @Configuration public class MultiDataSourceConfig { // 主数据源,添加@Primary标记为项目默认数据源 @Primary @Bean @ConfigurationProperties(prefix = "spring.datasource.hikari") public DataSource bluecostDataSource() { return DataSourceBuilder.create() // 此处就是你提到的指定Hikari数据源类型的配置 .type(HikariDataSource.class) .build(); } // 批处理数据源 @Bean @ConfigurationProperties(prefix = "spring.batch-datasource.hikari") public DataSource batchDataSource() { return DataSourceBuilder.create() .type(HikariDataSource.class) .build(); } }
补充说明
完成上述配置后,两个数据源的auto-commit都会生效,且日志中连接池名称会显示为你自定义的BluecostHikariPool和BatchHikariPool,可以直接区分不同数据源的运行日志。
如果你项目中还配置了JPA的EntityManager、事务管理器,多数据源场景下需要分别为两个数据源配置对应的EntityManagerFactory和事务管理器,避免出现配置冲突。
内容的提问来源于stack exchange,提问作者Woodsman
相关产品推荐
相关产品推荐

