SqlSession 的关闭是否可以这样理解

SqlSession 的关闭是否可以这样理解

我从源代码中查看到了关闭方法 DefaultSqlSession

public void close() {
    try {
        this.executor.close(this.isCommitOrRollbackRequired(false));
        this.closeCursors();
        this.dirty = false;
    } finally {
        ErrorContext.instance().reset();
    }

}

真正关闭的是从executor这个接口的实现类关闭的,这个接口的实现类有两个BaseExecutor CachingExecutor

从源码中看,如果是直连数据库就会调用BaseExecutor中的关闭方法.

public void close(boolean forceRollback) {
    try {
        try {
            this.rollback(forceRollback);
        } 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;
    }

}

this.transaction.close(); 又调到了JdbcTransaction类的close方法,确实调用了connection.close()方法

public void close() throws SQLException {
    if (this.connection != null) {
        this.resetAutoCommit();
        if (log.isDebugEnabled()) {
            log.debug("Closing JDBC Connection [" + this.connection + "]");
        }

        this.connection.close();
    }

}

而CachingExecutor是在使用连接池调用的方法,如下对事务进行了提交,但是连接是如何又放回到连接池呢?我看代码是调用了TransactionalCacheManager这里面通过HashMap存储了TransactionalCache. 提交事务以后实际上是将TransactionalCache reset了

public void close(boolean forceRollback) {
    try {
        if (forceRollback) {
            this.tcm.rollback();
        } else {
            this.tcm.commit();
        }
    } finally {
        this.delegate.close(forceRollback);
    }

}
public void commit() {
    if (this.clearOnCommit) {
        this.delegate.clear();
    }

    this.flushPendingEntries();
    this.reset();
}


正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
提问者 JakePrim 2020-02-29 09:59:18

从源码的层次可以更容易理解SqlSession的关闭为什么会这样,这样跟有助于理解和记忆,建议老师多从源码的角度来讲解

  • 同学你好,首先非常感谢同学的分享,我们也会反馈同学的建议,只是因为就业班的同学基础比较薄弱,如果讲解太多源码反而可能会记不住如何使用,不过,同学的建议我们也会反馈给老师进行商讨的,再次感谢同学的分享。祝学习愉快
    2020-02-29 13:56:34
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师