RabbitMQ结合Hibernate报错:无法提交JDBC连接
问题
我正在开发一个基于JHipster的Spring Boot小型应用,该应用监听RabbitMQ队列,确认消息后执行Hibernate仓库操作。目前消息消费正常,但调用Hibernate仓库时出现事务管理器混乱,抛出如下异常:
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) ... Caused by: org.postgresql.util.PSQLException: Cannot commit when autoCommit is enabled. at org.postgresql.jdbc.PgConnection.commit(PgConnection.java:872)
我的RabbitMQ配置如下:
@Configuration public class RabbitExchangeConfiguration { @Bean Queue queue() { return new Queue("myQueue", false); } }
TestService类包含RabbitMQ监听器listen方法和调用数据库事务管理器访问仓库的test方法:
@Service public class TestService { public TestService( MyRepository myRepository ) { this.myRepository= myRepository; } // 消息监听方法 @RabbitListener(queues = "datafactory") public void listen(Message in) { String messageBody = new String(in.getBody()); test(messageBody); } // 仓库操作方法 @Transactional(transactionManager = "myDatabaseTransactionManager") public void test(String content) { myRepository.findById(content).orElse(null); .. } }
注释test方法调用时消息可正常接收,调用则抛出异常。我曾疑惑能否在进入Hibernate事务上下文前结束RabbitMQ事务,以及监听器为何使用Hibernate事务。
解决方案
问题已解决:感谢p3consulting的回答,发现JHipster默认配置了jpa.properties.hibernate.connection.provider_disables_autocommit=true,只需添加以下配置禁用自动提交即可:
spring.datasource.hikari.auto-commit=false // 禁用自动提交 spring.jpa.properties.hibernate.connection.provider_disables_autocommit=false // 保持禁用状态
此问题与RabbitMQ无关。
内容的提问来源于stack exchange,提问作者GameDroids
相关产品推荐
相关产品推荐

