Mybatis核心组件作用域与生命周期
所谓生命周期就是每一个对象应该存活的时间,有些对象用完一次后就不再使用,这时就要对这些对象进行GC处理,以免继续占用资源,所以我们会根据Mybatis中每个组件的作用去确定其生命周期
SqlSessionFactoryBuilder
SqlSessionFactoryBuilder的作用在于创建SqlSessionFactory,创建后,SqlSessionFactoryBuilder就完成了使命,失去了作用;因此它适合存在于创建SqlSessionFactory的方法中,不宜长期存在。SqlSessionFactoryBuilder实例最适合的作用域是方法作用域(方法的局部变量)。
SqlSessionFactory
SqlSessionFactory可以认为是一个数据库连接池,它的作用是创建SqlSession接口对象。因为Mybatis的本质就是Java对数据库的操作,所以SqlSessionFactory的生命周期存在于整个Mybatis的应用之中,所以一旦创建了SqlSessionFactory,就要长期保存它,直至Mybatis应用程序运行结束,所以可以认为SqlSessionFactory的生命周期就是Mybatis应用程序的生命周期。
SqlSessionFactory的创建会消耗可观的系统资源。因此在一般的应用中,我们只创建一个SqlSessionFactory实例,让它在整个Mybatis应用程序中共享。所以,SqlSessionFactory最佳的作用域是全局作用域。
SqlSession
SqlSession可以看做是JDBC中一个数据库连接对象(Connection对象),你可以在一个事务中执行多条SQL,并通过commit,rollback等方法,提交或回滚事务。
SqlSession应该存活在一个业务请求中,处理完整个请求后,应该关闭这条连接。一般使用try…catch…finally语句来保证其及时关闭。
因此SqlSession最佳作用域为方法作用域。
Mapper
Mapper作为一个接口,由SqlSession所创建,所以它的最大生命周期与SqlSession保持一致,随着SqlSession的关闭,Mapper的数据库连接资源也会消失,所以其生命周期应该小于等于SqlSession的生命周期。Mapper代表的是一个请求中的业务处理,所以它应该在一个请求中,一旦处理完相关的业务,就要及时废弃它。
Mybatis各组件的生命周期如图所示