mybatis 3.4.2 Default Sql Sessionの配置

14499 ワード

Default Sql Session FactoryでもSql Session ManagerでもsessionはそのDefault Sql Sessionです。
Sql Session Managerが解決したのは、現在のスレッド中のセッションをキャッシュするだけで、セッションの多重化を実現します。Default Sql Session Factoryが提供したSQL操作ごとに新たなセッション例を作成します。
前のいくつかの文章は配置ファイルからsessionに分析されました。
一、セッションの構成を見てみます。
1、セッションの入り口を取得する
 public SqlSession openSession() {
    return openSessionFromDataSource(configuration.getDefaultExecutorType(), null, false);
  }
2、配置セッション
  private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) {
    Transaction tx = null;
    try {
      final Environment environment = configuration.getEnvironment();
      final TransactionFactory transactionFactory = getTransactionFactoryFromEnvironment(environment);
      tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit);
      final Executor executor = configuration.newExecutor(tx, execType);
      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();
    }
  }
3、関連パラメータ
 ExecutorType execType = configuration.getDefaultExecutorType();

  Executor executor = configuration.newExecutor(tx, execType);



TransactionIsolationLevel level= null;

boolean autoCommit = false;

TransactionFactory transactionFactory= getTransactionFactoryFromEnvironment(environment);

  Transaction tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit);
二、パラメータの取得
1、ExectorType
ExectorTypeは列挙類です。
public enum ExecutorType {
  SIMPLE, REUSE, BATCH
}
Configrationクラスでは、設定されているdefaultExectorTypeのデフォルト値はExectorType.SIMPPLEです。
public class Configuration {
...
protected ExecutorType defaultExecutorType = ExecutorType.SIMPLE;
...
}
ExectorTypeの設定は、sessionのアクチュエータExectorが異なる実現クラスを使用することを決定します。
Executor executor = configuration.newExecutor(tx, execType);
2、sessionアクチュエータの設定とパッケージExectorTypeはsessionアクチュエータのパッケージポリシーを決定します。
  public Executor newExecutor(Transaction transaction, ExecutorType executorType) {
    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);
    }
    if (cacheEnabled) {
      executor = new CachingExecutor(executor);
    }
    executor = (Executor) interceptorChain.pluginAll(executor);
    return executor;
  }
sessionアクチュエータexectorは、SimpleExector、ReuseExector、およびBatch Exectorの3つしかない。そして、cacheを開くと、CachingExectorを飾り、すべてのプラグインチェーンのアクチュエータを包装する。
executor = (Executor) interceptorChain.pluginAll(executor)
アクチュエータの関係の後に別の文章を紹介します。
3、Transaction Factory
このTransactoryには、プロファイルmybatis-config.xmlのenvironmentsのサブ要素transpationManagerが対応しています。
   <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC" />
            <dataSource type="POOLED">
                <property name="driver" value="${db.driver}" />
                <property name="url" value="${db.url}" />
                <property name="username" value="${db.username}" />
                <property name="password" value="${db.password}" />
                <property name="poolPingQuery" value="SELECT NOW()" />
                <property name="poolPingEnabled" value="true" />
            dataSource>
        environment>
    environments>
tractionManagerの取得値は二つだけです。JDBCとMANAGEDが設定されていない場合、mybatisはMANAGEDを使ってsessionを設定します。
Configrationの構造関数からこれらのパラメータの任意の値が見られます。
  public Configuration() {
    typeAliasRegistry.registerAlias("JDBC", JdbcTransactionFactory.class);
    typeAliasRegistry.registerAlias("MANAGED", ManagedTransactionFactory.class);

    typeAliasRegistry.registerAlias("JNDI", JndiDataSourceFactory.class);
    typeAliasRegistry.registerAlias("POOLED", PooledDataSourceFactory.class);
    typeAliasRegistry.registerAlias("UNPOOLED", UnpooledDataSourceFactory.class);

    typeAliasRegistry.registerAlias("PERPETUAL", PerpetualCache.class);
    typeAliasRegistry.registerAlias("FIFO", FifoCache.class);
    typeAliasRegistry.registerAlias("LRU", LruCache.class);
    typeAliasRegistry.registerAlias("SOFT", SoftCache.class);
    typeAliasRegistry.registerAlias("WEAK", WeakCache.class);

    typeAliasRegistry.registerAlias("DB_VENDOR", VendorDatabaseIdProvider.class);

    typeAliasRegistry.registerAlias("XML", XMLLanguageDriver.class);
    typeAliasRegistry.registerAlias("RAW", RawLanguageDriver.class);

    typeAliasRegistry.registerAlias("SLF4J", Slf4jImpl.class);
    typeAliasRegistry.registerAlias("COMMONS_LOGGING", JakartaCommonsLoggingImpl.class);
    typeAliasRegistry.registerAlias("LOG4J", Log4jImpl.class);
    typeAliasRegistry.registerAlias("LOG4J2", Log4j2Impl.class);
    typeAliasRegistry.registerAlias("JDK_LOGGING", Jdk14LoggingImpl.class);
    typeAliasRegistry.registerAlias("STDOUT_LOGGING", StdOutImpl.class);
    typeAliasRegistry.registerAlias("NO_LOGGING", NoLoggingImpl.class);

    typeAliasRegistry.registerAlias("CGLIB", CglibProxyFactory.class);
    typeAliasRegistry.registerAlias("JAVASSIST", JavassistProxyFactory.class);

    languageRegistry.setDefaultDriverClass(XMLLanguageDriver.class);
    languageRegistry.register(RawLanguageDriver.class);
  }
Jdbc Transactoryが作成したのはJdbc Transationです。ManagedTransactoryが作成したのはManaged Transationです。
実際にManagedTransationの多くの方法は空です。Jdbc Transationを使用します。
Transation txは、アクチュエータexectorに値を与えられる。

Transaction tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit);

Executor executor = configuration.newExecutor(tx, execType);
アクチュエータexectorはconfigrationと共にDefault Sql Sessionを生成する。
new DefaultSqlSession(configuration, executor, autoCommit);
Created with Rapha_l 2.10からプロファイルmapping/mybatis-config.xmlは、入力ストリームInputStream inputStream=Resource.gets Astreamを含む。Sql Session Manager sql Session Manager=Sql Session Manager.newInstance(inputStream);sql Session Manager.startManagedSession()sql Session Managerを使ってデータベースの操作を終了します。