当前位置:   article > 正文

MyBatis在Spring环境下的事务管理_mybatis springmanagedtr

mybatis springmanagedtr

MyBatis的设计思想很简单,可以看做是对JDBC的一次封装,并提供强大的动态SQL映射功能。但是由于它本身也有一些缓存、事务管理等功能,所以实际使用中还是会碰到一些问题——另外,最近接触了JFinal,其思想和Hibernate类似,但要更简洁,和MyBatis的设计思想不同,但有一点相同:都是想通过简洁的设计最大限度地简化开发和提升性能——说到性能,前段时间碰到两个问题:

  1. 在一个上层方法(DAO方法的上层)内删除一条记录,然后再插入一条相同主键的记录时,会报主键冲突的错误。
  2. 某些项目中的DAO方法平均执行时间会是其他一些项目中的** 2倍 **。

第一个问题是偶尔会出现,在实验环境无论如何也重现不了,经过分析MyBatis的逻辑,估计是两个DAO分别拿到了两个不同的Connection,第二个语句比第一个更早的被提交,导致了主键冲突,有待进一步的分析和验证。对于第二个问题,本文将尝试通过分析源代码和实验找到它的root cause,主要涉及到以下内容:

  1. 问题描述与分析
  2. MyBatis在Spring环境下的载入过程
  3. MyBatis在Spring环境下事务的管理
  4. 实验验证

项目环境

整个系统是微服务架构,这里讨论的「项目」是指一个单独的服务。单个项目的框架基本是Spring+MyBatis,具体版本如下:

Spring 3.2.9/4.3.5 + Mybatis 3.2.6 + mybatis-spring 1.2.2 + mysql connector 5.1.20 + commons-dbcp 1.4

与MyBatis和事务相关的配置如下:

  1. //代码1
  2. <!-- bean#1-->
  3. <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
  4. destroy-method="close">
  5. <!-- 一些数据库信息配置-->
  6. <!-- 一些DBCP连接池配置 -->
  7. //在这里设置是否自动提交
  8. <property name="defaultAutoCommit" value="${dbcp.defaultAutoCommit}" />
  9. </bean>
  10. <!-- bean#2-->
  11. <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  12. <property name="dataSource" ref="dataSource" />
  13. <property name="mapperLocations" value="classpath*:path/to/mapper/**/*.xml" />
  14. </bean>
  15. <!-- bean#3 -->
  16. <bean id="transactionManager"
  17. class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  18. <property name="dataSource" ref="dataSource" />
  19. </bean>
  20. <!-- bean#4-->
  21. <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
  22. <property name="basePackage" value=".path.to.mapper" />
  23. <property name="sqlSessionFactoryBeanName"
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/707731
推荐阅读
相关标签
  

闽ICP备14008679号