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

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

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

1
2
3
4
5
6
7
8
9
10
public void close() {
    try {
        this.executor.close(this.isCommitOrRollbackRequired(false));
        this.closeCursors();
        this.dirty = false;
    finally {
        ErrorContext.instance().reset();
    }
 
}

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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()方法

1
2
3
4
5
6
7
8
9
10
11
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了

1
2
3
4
5
6
7
8
9
10
11
12
public void close(boolean forceRollback) {
    try {
        if (forceRollback) {
            this.tcm.rollback();
        else {
            this.tcm.commit();
        }
    finally {
        this.delegate.close(forceRollback);
    }
 
}
1
2
3
4
5
6
7
8
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下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

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