MyBatis的数据源,连接和事务实现原理概述

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lichunericli/article/details/82315601

1. 数据源工厂 
MyBatis有提供3种内置的数据源类型:UNPOOLED,POOLED和JNDI。
public interface DataSourceFactory {
  // 设置属性,被XMLConfigBuilder所调用
  void setProperties(Properties props);
  // 生产数据源,直接得到javax.sql.DataSource
  DataSource getDataSource();
}

实际应用中,通常是使用C3P0和Druid等第三方的连接池工具包来管理数据库的连接,很少使用MyBatis自带的实现。如果使用也通常是使用POOLED的方式来进行连接的管理,如果是使用UNPOOLED和JNDI的话,需要注意其属性值的配置分别是以env.和driver.开头才行。

2. MyBatis连接池实现
MyBatis有提供自己的POOLED连接池实现,通过结合PoolState类中的idleConnections和activeConnections属性,以及对其中的方法通过使用synchronized,wait和notifyAll来进行线程安全性交互处理的。其对Connection连接的有效性判断是通过statement.executeQuery("NO PING QUERY SET")是否存在异常来判断的。

3. MyBatis的事务处理
MyBatis的Transaction接口包装了数据库的连接,并提供commit,rollback和close方法。MyBatis中有提供两种事务类型管理器,其类型是:TYEP=[JDBC|MANAGED],通常单纯的select是不存在事务处理的【除非引入Spring框架,强行补上事务】。

JdbcTransaction和ManagedTransaction【托管事务通常交由Spring框架处理】的成员变量都包括:TransactionIsolationLevel,Connection和DataSource。JdbcTransaction还拥有成员变量autoCommmit来表示是否自动提交事务,ManagedTransaction拥有closeConnection来表示是否关闭连接。MyBatis有提供JdbcTransactionFactory和ManagedTransactionFactory来获取配置信息和生成相关事务对象。

4. 事务隔离级别:
  NONE(Connection.TRANSACTION_NONE),
  READ_COMMITTED(Connection.TRANSACTION_READ_COMMITTED),
  READ_UNCOMMITTED(Connection.TRANSACTION_READ_UNCOMMITTED),
  REPEATABLE_READ(Connection.TRANSACTION_REPEATABLE_READ),
  SERIALIZABLE(Connection.TRANSACTION_SERIALIZABLE);

Jdbc事务是直接利用JDBC的commit和rollback;它依赖于从数据源得到的连接来管理事务范围;直到getConnection()被调用才会产生连接,这是种延迟加载;如果autocommit的状态是on,那么commit和rollback会被直接忽略。ManagedTransaction托管事务是将事务交给容器来管理,它从不提交或者回滚连接,它会让容器来管理整个事务的生命周期,例如Spring等。默认情况下连接是关闭的。

总结:MyBatis对数据源,连接和事务实现都是比较简单粗暴的,实际运用通常是通过Spring+Druid来进行精细化处理的。

猜你喜欢

转载自blog.csdn.net/lichunericli/article/details/82315601