Maison > Java > javaDidacticiel > le corps du texte

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

巴扎黑
Libérer: 2017-07-24 15:56:17
original
4759 Les gens l'ont consulté

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     }
Copier après la connexion

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);
Copier après la connexion

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;
    }
Copier après la connexion

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

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>
Copier après la connexion
 public void close() {try {this.executor.close(this.isCommitOrRollbackRequired(false));this.dirty = false;
        } finally {
            ErrorContext.instance().reset();
        }

    }
Copier après la connexion
    
 进入Executor接口  查看他的实现类BaseExecutor 找到close()方法<br>
Copier après la connexion
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;
        }

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

        }
    }
Copier après la connexion
 <br>
Copier après la connexion
<br>
Copier après la connexion
Copier après la connexion

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()参数改变了。
Copier après la connexion

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()方法
Copier après la connexion

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



000000000写的好low啊自嘲
Copier après la connexion

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal