Mybaits的生命周期
分类:
文章
•
2024-01-25 17:32:52
对象工厂
- MyBatis 每次创建结果对象的新实例时,它都会使用一个对象工厂(ObjectFactory)实例来完成。
- 默认的对象工厂需要做的仅仅是实例化目标类,要么通过默认构造方法,要么在参数映射存在的时候通过有参构造方法来实例化。
- 如果想覆盖对象工厂的默认行为,则可以通过创建自己的对象工厂来实现。【了解即可】
生命周期和作用域
作用域的理解
SqlSessionFactoryBuilder
- SqlSessionFactoryBuilder的作用是创建SqlSessionFactory,创建工厂后,它就失去了作用,所以它只能存在于创建SqlSessionFactory 的方法中,所以这个是在工具类的static中,只需要加载一次。它是局部方法变量)。
- SqlSessionFactory可以被认为是一个数据库连接池,它的作用是创建SqlSession连接接口对象。又因为Mybatis的本质就是java对数据库的操作,所以SqlSessionFactory的生命周期存在于整个Mybatis的应用之中,所以一旦创建了SqlSessionFactory。就要长期保存它,直至不再使用Mybatis的应用,所以可以认为SqlSessionFactory的生命周期就等同于Mybatis的应用周期。(也就是说SqlSessionFactory一旦被创建就应该在应用的运行期间一直存在,不会丢弃或者重新创建另一个实例 )
- 因此SqlSessionFactory的最佳作用域就是应用作用域
- 最简单的就是使用单例模式或者静态单例模式
SqlSession
- 如果说 SqlSessionFactory 相当于数据库连接池,那么 SqlSession 就相当于一个数据库连接(Connection 对象),你可以在一个事务里面执行多条 SQL,然后通过它的 commit、rollback 等方法,提交或者回滚事务。所以它应该存活在一个业务请求中,处理完整个请求后,应该关闭这条连接,让它归还给 SqlSessionFactory,否则数据库资源就很快被耗费精光,系统就会瘫痪,所以用 try…catch…finally… 语句来保证其正确关闭。
SqlSession
简单来说就是:
- 它是连接到连接池的一个请求,SqlSession完全包含了面向数据库的SQL命令
- SqlSession的实例不是线程安全的,因此是不能被共享的,所以它的最佳作用域是请求或方法作用域。
- 用完之后需要赶紧关闭,否则资源被占用。