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(); } |
11
收起
正在回答 回答被采纳积分+1
3. Java 数据库开发与实战应用
- 参与学习 人
- 提交作业 357 份
- 解答问题 8016 个
本阶段将带你学习MySQL数据库,JDBC接口,MyBatis框架等,带你掌握的数据的存放和管理。
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧