当前位置:网站首页>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
- DAC0832 waveform generator based on 51 single chip microcomputer
- Alibaba political commissar system - Chapter 1: political commissars are built on companies
- Proteus simulation based on msp430f2491 (realize water lamp)
- [beauty of software engineering - column notes] 29 | automated testing: how to kill bugs in the cradle?
- Application scheme of charging pile
- Dp1332e multi protocol highly integrated contactless read-write chip
- Intelligent shelf safety monitoring system
- CentOS deploy PostgreSQL 13
- Tb6600+stm32f407 test
猜你喜欢

Tle5012b+stm32f103c8t6 (bluepill) reading angle data

Unity shader learning (VI) achieving radar scanning effect
![[beauty of software engineering - column notes] 30 | make good use of source code management tools to make your collaboration more efficient](/img/d1/5b980d8b9580b9808b2b3f51d5b9c6.png)
[beauty of software engineering - column notes] 30 | make good use of source code management tools to make your collaboration more efficient

V-Ray 5 acescg workflow settings

阿里巴巴政委体系-第一章、政委建在连队上

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

CentOS deploy PostgreSQL 13
![[robomaster] control RM motor from scratch (2) -can communication principle and electric regulation communication protocol](/img/7c/ba52c7bc11d165892d7390ad8ce298.png)
[robomaster] control RM motor from scratch (2) -can communication principle and electric regulation communication protocol

110道 MySQL面试题及答案 (持续更新)

Tcp/ip five layer reference model and corresponding typical devices and IPv6
随机推荐
Exercise: store department information
2.4G band wireless transceiver chip si24r1 summary answer
[beauty of software engineering - column notes] "one question and one answer" issue 3 | 18 common software development problem-solving strategies
Mqtt server setup and mqtt.fx testing
Official tutorial redshift 01 basic theoretical knowledge and basic characteristics learning
(Video + graphic) machine learning introduction series - Chapter 5 machine learning practice
华为无线设备配置利用WDS技术部署WLAN业务
[academic related] why can't many domestic scholars' AI papers be reproduced?
An optimal buffer management scheme with dynamic thresholds paper summary
Solve the problem of MSVC2017 compiler with yellow exclamation mark in kits component of QT
Reading papers on false news detection (4): a novel self-learning semi supervised deep learning network to detect fake news on
Tb6600+stm32f407 test
[noi simulation] computational geometry (convex hull, violence, and search set)
【学术相关】为什么很多国内学者的AI的论文复现不了?
125kHz wake-up function 2.4GHz single transmitter chip-si24r2h
Simulation of four way responder based on 51 single chip microcomputer
STM32 serial port garbled
[beauty of software engineering - column notes] 22 | how to do a good job in technology selection for the project?
The difference between torch.tensor and torch.tensor
Simplefoc parameter adjustment 2- speed and position control