mybatis源码分析之SqlSession的创建过程
2016-04-21 00:00
886 查看
摘要: mybatis源码分析之SqlSession的创建过程
mybatis之SqlSessionFactory
mybatis源码分析之Configuration
mybatis源码分析之事务管理器
以上是之前的分析,在mybatis源码分析之事务管理器里分析到了事务管理器
之前已经分析过事务管理器,下面分析执行器Executor
执行器类型只有三种
SIMPLE:普通的执行器;
REUSE:执行器会重用预处理语句(prepared statements);
BATCH:执行器将重用语句并执行批量更新。
二级缓存开关配置示例
执行器创建后
至此SqlSession创建完成,从之前的几篇和这篇能清晰的看到从读取配置文件到SqlSession创建的整个过程.需要注意的是SqlSession 的实例不是线程安全的,是不能被共享的,所以它的最佳的范围是请求或方法范围.每个线程都应该有自己的 SqlSession 实例.
mybatis之SqlSessionFactory
mybatis源码分析之Configuration
mybatis源码分析之事务管理器
以上是之前的分析,在mybatis源码分析之事务管理器里分析到了事务管理器
SqlSession session = sqlSessionFactory.openSession(); //DefaultSqlSessionFactory里的openSession public SqlSession openSession() { return openSessionFromDataSource(configuration.getDefaultExecutorType(), null, false); } private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) { Transaction tx = null; try { //根据配置获取环境 final Environment environment = configuration.getEnvironment(); //构建事务工厂 final TransactionFactory transactionFactory = getTransactionFactoryFromEnvironment(environment); //通过事务工厂创建事务Transaction对象 tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit); //创建执行器Executor对象 final Executor executor = configuration.newExecutor(tx, execType); //根据configuration,executor创建DefaultSqlSession对象 return new DefaultSqlSession(configuration, executor, autoCommit); } catch (Exception e) { closeTransaction(tx); // may have fetched a connection so lets call close() throw ExceptionFactory.wrapException("Error opening session. Cause: " + e, e); } finally { ErrorContext.instance().reset(); } }
之前已经分析过事务管理器,下面分析执行器Executor
public enum ExecutorType { SIMPLE, REUSE, BATCH }
执行器类型只有三种
SIMPLE:普通的执行器;
REUSE:执行器会重用预处理语句(prepared statements);
BATCH:执行器将重用语句并执行批量更新。
configuration.newExecutor(tx, execType); //默认执行器类型 protected ExecutorType defaultExecutorType = ExecutorType.SIMPLE; //二级缓存的全局开关,默认开启缓存 protected boolean cacheEnabled = true; public Executor newExecutor(Transaction transaction, ExecutorType executorType) { //executorType为null时executorType=ExecutorType.SIMPLE executorType = executorType == null ? defaultExecutorType : executorType; executorType = executorType == null ? ExecutorType.SIMPLE : executorType; Executor executor; //根据执行器类型创建执行器 if (ExecutorType.BATCH == executorType) { executor = new BatchExecutor(this, transaction); } else if (ExecutorType.REUSE == executorType) { executor = new ReuseExecutor(this, transaction); } else { executor = new SimpleExecutor(this, transaction); } //当cacheEnabled为true时创建CachingExecutor对象 if (cacheEnabled) { executor = new CachingExecutor(executor); } executor = (Executor) interceptorChain.pluginAll(executor); return executor; }
二级缓存开关配置示例
<settings> <setting name="cacheEnabled" value="true"/> </settings>
执行器创建后
new DefaultSqlSession(configuration, executor, autoCommit); //DefaultSqlSession构造方法 public DefaultSqlSession(Configuration configuration, Executor executor, boolean autoCommit) { this.configuration = configuration; this.executor = executor; this.dirty = false; this.autoCommit = autoCommit; }
至此SqlSession创建完成,从之前的几篇和这篇能清晰的看到从读取配置文件到SqlSession创建的整个过程.需要注意的是SqlSession 的实例不是线程安全的,是不能被共享的,所以它的最佳的范围是请求或方法范围.每个线程都应该有自己的 SqlSession 实例.
相关文章推荐
- PHP strtotime函数用法、实现原理和源码分析
- jQuery 源码分析笔记(3) Deferred机制
- jQuery 源码分析笔记(5) jQuery.support
- jQuery-1.9.1源码分析系列(十)事件系统之事件包装
- 深入浅析mybatis oracle BLOB类型字段保存与读取
- MyBatis MapperProvider MessageFormat拼接批量SQL语句执行报错的原因分析及解决办法
- oracle+mybatis 使用动态Sql当插入字段不确定的情况下实现批量insert
- MyBatis学习笔记(二)之关联关系
- 浅析Mybatis 在CS程序中的应用
- Java Mybatis框架入门基础教程
- Windows下Java+MyBatis框架+MySQL的开发环境搭建教程
- Android中使用二级缓存、异步加载批量加载图片完整案例
- Cocos2d-x学习笔记之Hello World源码分析
- PHP源码分析之变量的存储过程分解
- Java简单实现SpringMVC+MyBatis分页插件
- MyBatis批量添加、修改和删除
- MyBatis与Hibernate的比较
- 浅析mybatis和spring整合的实现过程
- 在Java的MyBatis框架中建立接口进行CRUD操作的方法
- 整理Java的MyBatis框架中一些重要的功能及基本使用示例