返回

MyBatis源码解读(六)SqlSession获取连接的实现

后端

在本文中,我们将继续探索MyBatis的源码,重点关注SqlSession如何获取数据库连接。我们将深入剖析SqlSession与JDBC连接池的交互过程,了解MyBatis是如何管理数据库连接并执行数据库操作的。

在前面的文章中,我们已经介绍了MyBatis的基本概念和体系结构。我们知道,SqlSession是MyBatis用来执行数据库操作的核心对象。它封装了与数据库的连接、事务管理和结果集处理等功能。

那么,SqlSession是如何获取数据库连接的呢?这正是本文要探讨的问题。

SqlSession获取连接的实现

SqlSession的连接获取逻辑主要集中在SqlSessionImpl类的getConnection方法中。该方法首先尝试从本地线程变量中获取连接。如果本地线程变量中没有连接,则从全局变量中获取连接。如果全局变量中也没有连接,则创建新的连接。

1. 从本地线程变量中获取连接

SqlSessionImpl类中有一个名为localSqlSession的本地线程变量,该变量存储着当前线程的SqlSession对象。SqlSessionImpl在构造函数中会将自身赋值给localSqlSession变量,这样,当前线程就可以通过localSqlSession变量访问SqlSession对象。

当SqlSessionImpl的getConnection方法被调用时,它首先会尝试从localSqlSession变量中获取连接。如果localSqlSession变量中有连接,则直接返回该连接。

2. 从全局变量中获取连接

如果localSqlSession变量中没有连接,则SqlSessionImpl的getConnection方法会尝试从全局变量SqlSessionManager中获取连接。SqlSessionManager是一个单例类,它存储着所有SqlSession对象的引用。

当SqlSessionImpl的构造函数被调用时,它会将自身注册到SqlSessionManager中。这样,SqlSessionManager就可以通过SqlSessionImpl的hashCode值找到SqlSession对象。

当SqlSessionImpl的getConnection方法被调用时,它会尝试从SqlSessionManager中获取连接。如果SqlSessionManager中有连接,则直接返回该连接。

3. 创建新的连接

如果localSqlSession变量和SqlSessionManager中都没有连接,则SqlSessionImpl的getConnection方法会创建一个新的连接。

创建连接的过程主要委托给SqlSessionManager的openSession方法。openSession方法会根据配置创建连接,并将其包装成SqlSession对象返回。

SqlSessionImpl的getConnection方法会将创建的连接存储在localSqlSession变量中,以便下次调用时可以直接返回。

SqlSession与JDBC连接池的交互

MyBatis使用JDBC连接池来管理数据库连接。JDBC连接池是一个软件组件,它可以维护一个预先建立的数据库连接池,以便应用程序可以快速获取和释放数据库连接。

MyBatis通过DataSource来与JDBC连接池交互。DataSource是一个接口,它定义了获取和释放数据库连接的方法。MyBatis在初始化时会创建一个DataSource对象,并将其存储在SqlSessionManager中。

当SqlSessionImpl的getConnection方法被调用时,它会使用DataSource对象获取数据库连接。DataSource对象会从连接池中获取一个连接,并将其返回给SqlSessionImpl。

当SqlSessionImpl的close方法被调用时,它会将连接归还给DataSource对象。DataSource对象会将连接放回连接池中,以便其他应用程序可以使用。

总结

SqlSession是MyBatis用来执行数据库操作的核心对象。它封装了与数据库的连接、事务管理和结果集处理等功能。

SqlSession获取连接的逻辑主要集中在SqlSessionImpl类的getConnection方法中。该方法首先尝试从本地线程变量中获取连接。如果本地线程变量中没有连接,则从全局变量中获取连接。如果全局变量中也没有连接,则创建新的连接。

MyBatis使用JDBC连接池来管理数据库连接。JDBC连接池是一个软件组件,它可以维护一个预先建立的数据库连接池,以便应用程序可以快速获取和释放数据库连接。

MyBatis通过DataSource来与JDBC连接池交互。DataSource是一个接口,它定义了获取和释放数据库连接的方法。MyBatis在初始化时会创建一个DataSource对象,并将其存储在SqlSessionManager中。

当SqlSessionImpl的getConnection方法被调用时,它会使用DataSource对象获取数据库连接。DataSource对象会从连接池中获取一个连接,并将其返回给SqlSessionImpl。

当SqlSessionImpl的close方法被调用时,它会将连接归还给DataSource对象。DataSource对象会将连接放回连接池中,以便其他应用程序可以使用。