前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MyBatis源码分析之——SqlSession会话创建过程

MyBatis源码分析之——SqlSession会话创建过程

作者头像
冰河
发布2020-10-29 15:38:14
5040
发布2020-10-29 15:38:14
举报
文章被收录于专栏:冰河技术冰河技术

MyBatis操作的时候跟数据库的每一次连接,都需要创建一个会话,我们用openSession()方法来创建。这个会话里面需要包含一个Executor用来执行 SQL。Executor又要指定事务类型和执行器的类型。

1.创建Transaction(两种方式)

属性

产生工厂类

产生事务

JDBC

JdbcTransactionFactory

JdbcTransaction

MANAGED

ManagedTransactionFactory

ManagedTransaction

  • 如果配置的是 JDBC,则会使用Connection 对象的 commit()、rollback()、close()管理事务。
  • 如果配置成MANAGED,会把事务交给容器来管理,比如 JBOSS,Weblogic。
代码语言:javascript
复制
SqlSession sqlSession = sqlSessionFactory.openSession();
代码语言:javascript
复制
public SqlSession openSession() {
//configuration中有默认赋值
protected ExecutorType defaultExecutorType = ExecutorType.SIMPLE
  return openSessionFromDataSource(configuration.getDefaultExecutorType(), null, false);
}
代码语言:javascript
复制
<environments default="development">
  <environment id="development">
    <transactionManager type="JDBC"/>
    <dataSource type="POOLED">
      <property name="driver" value="${driver}"/>
      <property name="url" value="${url}"/>
      <property name="username" value="${username}"/>
      <property name="password" value="${password}"/>
    </dataSource>
  </environment>
</environments>

2.创建Executor

代码语言:javascript
复制
//ExecutorType是SIMPLE,一共有三种SIMPLE(SimpleExecutor)、REUSE(ReuseExecutor)、BATCH(BatchExecutor)
private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) {
  Transaction tx = null;
  try {
    //xml中的development节点
    final Environment environment = configuration.getEnvironment();
    //type配置的是Jbdc所以生成的是JbdcTransactionFactory工厂类
    final TransactionFactory transactionFactory = getTransactionFactoryFromEnvironment(environment);
    //Jdbc生成JbdcTransactionFactory生成JbdcTransaction
    tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit);
    //创建CachingExecutor执行器
    final Executor executor = configuration.newExecutor(tx, execType);
    //创建DefaultSqlSession属性包括 Configuration、Executor对象
    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();
  }
}

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-01-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 冰河技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.创建Transaction(两种方式)
  • 2.创建Executor
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档