当前位置:网站首页>PostgreSQL手动创建HikariDataSource解决报错Cannot commit when autoCommit is enabled
PostgreSQL手动创建HikariDataSource解决报错Cannot commit when autoCommit is enabled
2022-07-29 08:16:00 【坚持是一种态度】

问题
- 项目是使用jhipster构建的,使用liquibase管理数据库连接
- 我们使用的PostgreSQL数据库,由于业务需要,需要新增一个ClickHouse数据库,但是这样两个
DataSource导致程序出错
解决
- 首先,想的是对PostgreSQL数据库连接,显式声明。在
DatabaseConfiguration里,显式声明@Bean("springDataSource")并设置@Primary,优先加载使用pg
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
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 org.springframework.data.jpa.repository.config.EnableJpaAuditing;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import javax.sql.DataSource;
@Configuration
@EnableJpaRepositories({ "com.xxx.analysis.repository" })
@EnableJpaAuditing(auditorAwareRef = "springSecurityAuditorAware")
@EnableTransactionManagement
public class DatabaseConfiguration {
private static final Logger logger = LoggerFactory.getLogger(DatabaseConfiguration.class);
/**
* PG数据源
* 由于手动注入了CK数据源,所以需要在这里显式声明PG数据源优先为springDataSource
* @param properties yml里的数据源配置
* @return dataSource
*/
@Primary //默认优先选择
@Bean("springDataSource") //注入springDataSource对象
@ConfigurationProperties(prefix = "spring.datasource") //注入dspringDataSource对象读取配置文件,spring.datasource为前缀,之后字段和实体类的属性一致进行匹配诸如内容
public DataSource dataSource(DataSourceProperties properties) {
logger.info("init master data source:{}", properties.determineDatabaseName());
return DataSourceBuilder.create().build();
}
}
- 这样程序启动没有报错了,但是使用起来有问题,报错
org.springframework.orm.jpa.JpaSystemException: Unable to commit against JDBC Connection; nested exception is org.hibernate.TransactionException: Unable to commit against JDBC Connection
Caused by: org.hibernate.TransactionException: Unable to commit against JDBC Connection
at org.hibernate.resource.jdbc.internal.AbstractLogicalConnectionImplementor.commit(AbstractLogicalConnectionImplementor.java:92)
at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.commit(JdbcResourceLocalTransactionCoordinatorImpl.java:282)
at org.hibernate.engine.transaction.internal.TransactionImpl.commit(TransactionImpl.java:101)
at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:562)
... 155 common frames omitted
Caused by: org.postgresql.util.PSQLException: Cannot commit when autoCommit is enabled.
at org.postgresql.jdbc.PgConnection.commit(PgConnection.java:872)
at com.zaxxer.hikari.pool.ProxyConnection.commit(ProxyConnection.java:387)
at com.zaxxer.hikari.pool.HikariProxyConnection.commit(HikariProxyConnection.java)
at org.hibernate.resource.jdbc.internal.AbstractLogicalConnectionImplementor.commit(AbstractLogicalConnectionImplementor.java:86)
... 158 common frames omitted
- 改为使用注解声明后,
autoCommit没生效,调试了下发现DataSourceProperties只接收部分参数,而autoCommit没在里面 - 没办法,只好自己接收参数,自己创建连接初始化
HikariDataSource了,最终配置和代码如下
配置文件
spring:
datasource:
type: com.zaxxer.hikari.HikariDataSource
url: jdbc:postgresql://192.168.1.50:5432/june
username: postgres
password: postgres
hikari:
poolName: Hikari
autoCommit: false
maximum-pool-size: 100
connection-timeout: 60000
idle-timeout: 400000
minimum-idle: 10
max-lifetime: 480000
connection-test-query: SELECT 1
代码
package com.xxx.analysis.config;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.util.StringUtils;
import javax.sql.DataSource;
@Configuration
@EnableJpaRepositories({
"com.xxx.analysis.repository" })
@EnableJpaAuditing(auditorAwareRef = "springSecurityAuditorAware")
@EnableTransactionManagement
public class DatabaseConfiguration {
private static final Logger logger = LoggerFactory.getLogger(DatabaseConfiguration.class);
@Value("${spring.datasource.hikari.poolName}")
private String poolName;
@Value("${spring.datasource.hikari.autoCommit}")
private boolean autoCommit;
@Value("${spring.datasource.hikari.connection-timeout}")
private Integer connectionTimeout;
@Value("${spring.datasource.hikari.idle-timeout}")
private Integer idleTimeout;
@Value("${spring.datasource.hikari.max-lifetime}")
private Integer maxLifetime;
@Value("${spring.datasource.hikari.minimum-idle}")
private Integer minimumIdle;
@Value("${spring.datasource.hikari.maximum-pool-size}")
private Integer maximumPoolSize;
@Value("${spring.datasource.hikari.connection-test-query}")
private String connectionTestQuery;
/** * PG数据源 * 由于手动注入了CK数据源,所以需要在这里显式声明PG数据源优先为springDataSource * @param properties yml里的数据源配置 * @return dataSource */
@Primary //默认优先选择
@Bean("springDataSource") //注入springDataSource对象
@ConfigurationProperties(prefix = "spring.datasource") //注入springDataSource对象读取配置文件,spring.datasource为前缀,之后字段和实体类的属性一致进行匹配诸如内容
public DataSource dataSource(DataSourceProperties properties) {
HikariDataSource dataSource = new HikariDataSource(getConfig(properties));
if (StringUtils.hasText(properties.getName())) {
dataSource.setPoolName(properties.getName());
}
return dataSource;
}
/** * 根据yml配置设置HikariConfig * @param properties * @return */
private HikariConfig getConfig(DataSourceProperties properties) {
HikariConfig hikariConfig = new HikariConfig();
hikariConfig.setJdbcUrl(properties.getUrl());
hikariConfig.setUsername(properties.getUsername());
hikariConfig.setPassword(properties.getPassword());
hikariConfig.setMaximumPoolSize(maximumPoolSize);
hikariConfig.setConnectionTestQuery(connectionTestQuery);
hikariConfig.setPoolName(poolName);
hikariConfig.setAutoCommit(autoCommit);
hikariConfig.setConnectionTimeout(connectionTimeout);
hikariConfig.setIdleTimeout(idleTimeout);
hikariConfig.setMaxLifetime(maxLifetime);
hikariConfig.setMinimumIdle(minimumIdle);
hikariConfig.addDataSourceProperty("dataSource.cachePrepStmts", "true");
hikariConfig.addDataSourceProperty("dataSource.prepStmtCacheSize", "250");
hikariConfig.addDataSourceProperty("dataSource.prepStmtCacheSqlLimit", "2048");
hikariConfig.addDataSourceProperty("dataSource.useServerPrepStmts", "true");
return hikariConfig;
}
}
边栏推荐
- Ws2812b color lamp driver based on f407zgt6
- 简易计算器微信小程序项目源码
- Proteus simulation based on 51 MCU ADC0808
- CentOS deploy PostgreSQL 13
- A problem encountered in SQL interview
- Alibaba political commissar system - Chapter 4: political commissars are built on companies
- TCP——滑动窗口
- [robomaster] a board receives jy-me01 angle sensor data -- Modbus Protocol & CRC software verification
- torch.Tensor.to的用法
- 华为无线设备配置利用WDS技术部署WLAN业务
猜你喜欢

Lora opens a new era of Internet of things -asr6500s, asr6501/6502, asr6505, asr6601

Ws2812b color lamp driver based on f407zgt6

Cv520 domestic replacement of ci521 13.56MHz contactless reader chip
![[密码学实验] 0x00 安装NTL库](/img/2a/03d95082a2a63238b475b3f7f3e13d.png)
[密码学实验] 0x00 安装NTL库

UE4 principle and difference between skylight and reflecting sphere
![[beauty of software engineering - column notes] 29 | automated testing: how to kill bugs in the cradle?](/img/e1/8a61f85bf93801d842e78ab4f7edc7.png)
[beauty of software engineering - column notes] 29 | automated testing: how to kill bugs in the cradle?

Inclination sensor accuracy calibration test

Unicode私人使用区域(Private Use Areas)

Mysql rownum 实现

Compatible with cc1101/cmt2300-dp4301 sub-1g wireless transceiver chip
随机推荐
Unicode私人使用区域(Private Use Areas)
Dp4301-sub-1g highly integrated wireless transceiver chip
[beauty of software engineering - column notes] "one question and one answer" issue 2 | 30 common software development problem-solving strategies
简易计算器微信小程序项目源码
STM32 printf problem summary semihosting microlib understanding
Reading papers on false news detection (4): a novel self-learning semi supervised deep learning network to detect fake news on
What is Amazon self support number and what should sellers do?
Unity Shader学习(六)实现雷达扫描效果
DAC0832 waveform generator based on 51 single chip microcomputer
Windows 安装 MySQL 5.7详细步骤
Exercise: store department information
ML.NET相关资源整理
Four pin OLED display based on stm32
TCP——滑动窗口
Proteus simulation based on msp430f2491
torch.nn.functional.one_ hot()
Operator overloading
Greenplus enterprise deployment
UE4 principle and difference between skylight and reflecting sphere
[academic related] why can't many domestic scholars' AI papers be reproduced?