Hibernate4、Hibernate5 和 DBCP 的兼容性问题

1 背景

周一回来发现用户中心批量更新手机号未生效,上 Nexus 看了下有没有人动了 lib-datasource(基础架构组的一个组件,简化连接池装配),最新一个版本在上周四,该版本解决了 AutoCommit 的问题,详见参考1。

2 排查过程

  1. 打断点,确认手机号在批量插入前已经脱敏。
  2. 联系DBA 输出 general_log,发现最后一步不是 commit,而是 rollback。

  3. 放开日志级别 ,发现程序有 commit。

  4. 既然 generl_log 现实有 rollback,直接在 java.sql.Connection#rollback() 上打了断点,并保留调用栈

TransactionInterceptor 是事务家的门房。

javax.transaction.TransactionManager,出身高贵,名副其实的官家。

TransactionManager 的大公子 AbstractPlatformTransactionManager 读了几年圣贤书,倒也有模有样,doCommit()、doRollback() 什么的顺手拈来,是其它小儿子的学习榜样。

狐狸精 SpringSessionSynchronization 把 AbstractPlatformTransactionManager 蛊惑了,使他在 triggerBeforeCompletion() 中还没 commit 就把自家 session 给断了(钱都败光了)。

AbstractPlatformTransactionManager 身无分文,只好把传家宝 Connection 贱卖给了包工头DBCP。

包工头DBCP 没有眼光,看这个 Connection 既不是AutoCommit,也不是只读,顺手就砸了它(回滚了 Connection)。

解决方法

  1. 直接上 HikariCP
  2. 换别的ORM实现(EBean),甚至 MyBatis、裸JDBC

Reference

[1] [排查 @Transactional 失效](https://www.cnblogs.com/mougg/p/12572773.html

原文地址:https://www.cnblogs.com/mougg/p/12601071.html

时间: 2024-11-08 17:57:17

Hibernate4、Hibernate5 和 DBCP 的兼容性问题的相关文章

spring4整合hibernate5.1

在另一篇文章hibernate5(2)初入门配置实例中,我们针对hibernate5.1版本的崭新引导配置方法,完成了对数据库的的插入实例操作,在本节内容中,我们开始引入spring4,完成spring4与hibernate5.1的整合工作,像数据库中插入一条记录.在后面学习hibernate中,我们都会使用spring来管理我们的Bean容器. 1. 导入spring4所需jar包 我们推荐使用maven来管理项目,下面是maven中的spring整合hibernate完整配置. <prope

Spring整合hibernate4:事务管理

Spring和Hibernate整合后,通过Hibernate API进行数据库操作时发现每次都要opensession,close,beginTransaction,commit,这些都是重复的工作,我们可以把事务管理部分交给spring框架完成. 配置事务(xml方式) 使用spring管理事务后在dao中不再需要调用beginTransaction和commit,也不需要调用session.close(),使用API  sessionFactory.getCurrentSession()来

Struts2,Spring3,Hibernate4整合--SSH框架

Struts2,Spring3,Hibernate4整合--SSH框架(学习中) 一.包的导入 1.Spring包 2.Hibernate 包 3.struts 包 4.数据库方面的包及junt4的包 二.配置文件 1.beans.xml (具体要注意的已经注释到 xml 中了,目前整合了Spring 与 hibernate4 ) <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="h

Struts2.3.4.1+Spring3.2.3+Hibernate4.1.9整合

java教程|Struts2.3.4.1+Spring3.2.3+Hibernate4.1.9整合教程并测试成功一.创建项目二.搭建struts-2.3.4.11.struts2必须的Jar包(放到WEB-INF/... Struts2.3.4.1+Spring3.2.3+Hibernate4.1.9整合教程并测试成功 一. 创建项目 二. 搭建struts-2.3.4.1 1.struts2必须的Jar包(放到WEB-INF/lib目录下): 2.配置struts2.3的过滤器 web.xml

Spring4 MVC Hibernate4集成

Spring4 MVC Hibernate4集成   Spring4 MVC Hibernate4集成 一.    本文所用环境 Spring4.0.3.RELEASE Hibernate4.3.5.Final Mysql 二.    工程目录 三.    Maven添加依赖 用Maven创建项目,pom.xml如下:   四.    新建数据库表 数据库采用Mysql,新建users表,我们演示操作此表 CREATE TABLE `users` ( `id` int(11) NOT NULL

三种数据库访问——Spring3.2 + Hibernate4.2

前三篇随笔中介绍了 用原生的JDBC访问数据库.一种高效的数据库连接池druid.用Spring的JDBC框架访问数据库. 本文继续介绍第三种数据库访问的解决方案:Spring3.2 + Hibernate4.2 ORM框架 Hibernate是一个开源的ORM框架,能自动为对象生成相应SQL并透明的持久化对象到数据库,我们首先来了解一下什么是“ORM”. ORM全称对象关系映射(Object/Relation Mapping),指将Java对象状态自动映射到关系数据库中的数据上,从而提供透明化

Struts2+Spring3+Hibernate4中,数据源应配置在Spring下,否则有异常:Cannot unwrap to requested type [javax.sql.DataSource]

启动项目,报错:org.hibernate.service.UnknownUnwrapTypeException: Cannot unwrap to requested type [javax.sql.DataSource].也就是说,不能打开数据源.可是我在Hibernate的配置文件中明明配置了数据源了啊.原来应该由Spring来管理数据源,而Hibernate只需要管理OR-Mapping就可以了.于是将Hibernate的数据源删除,在Spring中配置.代码如下: 1 <bean id

使用Maven搭建Struts2+Spring3+Hibernate4的整合开发环境

做了三年多的JavaEE开发了,在平时的JavaEE开发中,为了能够用最快的速度开发项目,一般都会选择使用Struts2,SpringMVC,Spring,Hibernate,MyBatis这些开源框架来开发项目,而这些框架一般不是单独使用的,经常是Struts2+Spring3+Hibernate.SpringMVC+Spring+Hibernate.SpringMVC+Spring+Mybatis这几种组合中的一种,也就是多个框架配合起来使用.今天来总结一下如何使用Maven搭建Struts

SSH的简单入门体验(Struts2.1+Spring3.1+Hibernate4.1)- 查询系统(上)

所谓SSH,指的是struts+spring+hibernate的一个集成框架,它是目前较流行的一种Web应用程序的开源框架. 集成SSH框架的系统从职责上分为四层:表示层.业务逻辑层.数据持久层和域模块层,以帮助开发人员在短期内搭建结构清晰.可复用性好.维护方便的Web应用程序.其中使用Struts作为系统的整体基础架构,负责MVC的分离,在Struts框架的模型部分,控制业务跳转,利用Hibernate框架对持久层提供支持,Spring做管理,管理struts和hibernate.(摘自百度