天天看點

MyBatis源碼分析之——SqlSession會話建立過程1.建立Transaction(兩種方式)2.建立Executor

MyBatis操作的時候跟資料庫的每一次連接配接,都需要建立一個會話,我們用openSession()方法來建立。這個會話裡面需要包含一個Executor用來執行 SQL。Executor又要指定事務類型和執行器的類型。

1.建立Transaction(兩種方式)

屬性 産生工廠類 産生事務
JDBC JdbcTransactionFactory JdbcTransaction
MANAGED ManagedTransactionFactory ManagedTransaction
  • 如果配置的是 JDBC,則會使用Connection 對象的 commit()、rollback()、close()管理事務。
  • 如果配置成MANAGED,會把事務交給容器來管理,比如 JBOSS,Weblogic。
SqlSession sqlSession = sqlSessionFactory.openSession();      
public SqlSession openSession() {
//configuration中有預設指派
protected ExecutorType defaultExecutorType = ExecutorType.SIMPLE
  return openSessionFromDataSource(configuration.getDefaultExecutorType(), null, false);
}      
<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

//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();
  }
}