Maison  >  Article  >  Java  >  Explication de l'utilisation de MyBatis openSession(), close() et commit()

Explication de l'utilisation de MyBatis openSession(), close() et commit()

巴扎黑
巴扎黑original
2017-07-24 15:56:174734parcourir

1 : Que fait exactement openSession dans la classe d'outils MyBatis ?

Classe d'outils Mybatis

 1     private static final String RESOURCE = "mybatis-config.xml"; 2     private static SqlSessionFactory sqlSessionFactory = null; 3     private static ThreadLocal<SqlSession> threadLocal = new ThreadLocal<SqlSession>(); 4  5  6  7  8     //关闭sqlsession 9     public static void closeSession(){10         SqlSession session = (SqlSession) threadLocal.get(); // 211         threadLocal.set(null);12         if (session !=null){13             session.close();14         }15     }16 17     public static SqlSession getSessionTwo() {18         //读取配置文件19         try {20             InputStream stream = Resources.getResourceAsStream(RESOURCE);21             sqlSessionFactory = new SqlSessionFactoryBuilder().build(stream);22 23             return sqlSessionFactory.openSession();   //返回openSession24         } catch (IOException e) {25             e.printStackTrace();26         }27 28         return null;29     }

Cliquez d'abord sur openSession et trouvez un moyen d'utiliser sqlsessionFactory

 1 package org.apache.ibatis.session; 2  3 import java.sql.Connection; 4  5 public interface SqlSessionFactory { 6     SqlSession openSession(); 7  8     SqlSession openSession(boolean var1); 9 10     SqlSession openSession(Connection var1);

Regardez ensuite la classe d'implémentation de cette méthode DefaultSqlSessionFactory

Ici, elle renvoie principalement une méthode de sa propre classe openSessionFroDataSource() (source de données ) et attribue une valeur autoCommit est faux

puis entrez cette méthode

 private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) {
        Transaction tx = null;

        DefaultSqlSession var8;try {
            Environment environment = this.configuration.getEnvironment();
            TransactionFactory transactionFactory = this.getTransactionFactoryFromEnvironment(environment);
            tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit);
            Executor executor = this.configuration.newExecutor(tx, execType);
            var8 = new DefaultSqlSession(this.configuration, executor, autoCommit);
        } catch (Exception var12) {this.closeTransaction(tx);throw ExceptionFactory.wrapException("Error opening session.  Cause: " + var12, var12);
        } finally {
            ErrorContext.instance().reset();
        }return var8;
    }

<br>
可以看到他这个方法主要是初始化一些configure.xml的配置信息和DefaultSqlSession
configure.xml的配置信息和DefaultSqlSession

2 : Outil MyBatis Pourquoi la couche sous-jacente de sqlSession.close() dans la classe annule-t-elle la transaction ?

Entrez d'abord close() pour trouver sa classe d'implémentation DefaultsqlSession

La méthode close dans DefaultsqlSession

 

session.close(); 底层为什么可以回滚事务?????<br>DefaultsqlSession里的close方法<br>
 public void close() {try {this.executor.close(this.isCommitOrRollbackRequired(false));this.dirty = false;
        } finally {
            ErrorContext.instance().reset();
        }

    }
    
 进入Executor接口  查看他的实现类BaseExecutor 找到close()方法<br>
public void close(boolean forceRollback) {   //需要传入一个boolean参数try {try {this.rollback(forceRollback);   //为true则rollback
            } finally {if(this.transaction != null) {   this.transaction.close();
                }

            }
        } catch (SQLException var11) {
            log.warn("Unexpected exception on closing transaction.  Cause: " + var11);
        } finally {this.transaction = null;this.deferredLoads = null;this.localCache = null;this.localOutputParameterCache = null;this.closed = true;
        }

    }
然后再看下executor.close()里的参数
.executor.close(.isCommitOrRollbackRequired(------>  isCommitOrRollbackRequired(  ||
forceRollback为true 然后进入rollback(forceRollBack)参数为true
看下最终的rollback方法  
public void rollback(boolean required) throws SQLException {
    if(!this.closed) {
        try {
            this.clearLocalCache();
            this.flushStatements(true);
        } finally {
            if(required) {
                this.transaction.rollback();   //如果传入的参数为 true     则进行事务 回滚
            }

        }
    }
 <br>
<br>

De plus, quant à savoir pourquoi la clôture annulera la transaction avant elle est soumis, il est soumis. Après cela, la transaction est clôturée

réside principalement dans la classe d'implémentation BaseExecutor de Executor

isCommitOrRollbackRequired()参数改变了。

session.commit. (); Pourquoi la transaction peut-elle être soumise ? L'implémentation est fondamentalement la même que l'implémentation de close(), principalement

isCommitOrRollbackRequired()方法

Les paramètres sont vrais ou faux. Si c'est vrai, elle sera soumise. faux, elle sera fermée <br> séance



000000000写的好low啊自嘲

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn