赞
踩
MyBatis的设计思想很简单,可以看做是对JDBC的一次封装,并提供强大的动态SQL映射功能。但是由于它本身也有一些缓存、事务管理等功能,所以实际使用中还是会碰到一些问题——另外,最近接触了JFinal,其思想和Hibernate类似,但要更简洁,和MyBatis的设计思想不同,但有一点相同:都是想通过简洁的设计最大限度地简化开发和提升性能——说到性能,前段时间碰到两个问题:
第一个问题是偶尔会出现,在实验环境无论如何也重现不了,经过分析MyBatis的逻辑,估计是两个DAO分别拿到了两个不同的Connection,第二个语句比第一个更早的被提交,导致了主键冲突,有待进一步的分析和验证。对于第二个问题,本文将尝试通过分析源代码和实验找到它的root cause,主要涉及到以下内容:
整个系统是微服务架构,这里讨论的「项目」是指一个单独的服务。单个项目的框架基本是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
- <!-- bean#1-->
- <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
- destroy-method="close">
- <!-- 一些数据库信息配置-->
- <!-- 一些DBCP连接池配置 -->
- //在这里设置是否自动提交
- <property name="defaultAutoCommit" value="${dbcp.defaultAutoCommit}" />
- </bean>
- <!-- bean#2-->
- <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
- <property name="dataSource" ref="dataSource" />
- <property name="mapperLocations" value="classpath*:path/to/mapper/**/*.xml" />
- </bean>
- <!-- bean#3 -->
- <bean id="transactionManager"
- class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
- <property name="dataSource" ref="dataSource" />
- </bean>
- <!-- bean#4-->
- <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
- <property name="basePackage" value=".path.to.mapper" />
- <property name="sqlSessionFactoryBeanName"
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。