作用域:局部作用域
生命周期:用完即弃
这个类可以被实例化、使用和丢弃,一旦创建了 SqlSessionFactory,就不再需要它了。 因此 SqlSessionFactoryBuilder 实例的最佳作用域是方法作用域(也就是局部方法变量)。 你可以重用 SqlSessionFactoryBuilder 来创建多个 SqlSessionFactory 实例,但最好还是不要一直保留着它,以保证所有的 XML 解析资源可以被释放给更重要的事情。
2、SqlSessionFactory作用域:应用作用域
生命周期:整个Application
SqlSessionFactory作为一个数据库连接池的作用是创建SqlSession接口对象。Mybatis其实是Java对数据库的 *** 作,所以SqlSessionFactory的生命周期存在于整个Mybatis程序中即整个Application,会长期保存,直至不再使用Mybatis。SqlSessionFactory在使用时占据着数据库的资源,如果创建多个就会导致数据库资源被耗光出现系统宕机等情况。最简单的方法是单例模式或者是静态单例模式。然 而这既不是广泛赞成和好用的。
3、SqlSession作用域:请求和局部作用域
生命周期:处理完整个请求后,应该关闭这条连接
如果说 SqlSessionFactory 相当于数据库连接池,那么 SqlSession 就相当于一个数据库连接(Connection 对象),你可以在一个事务里面执行多条 SQL,然后通过它的 commit、rollback 等方法,提交或者回滚事务。所以它应该存活在一个业务请求中,处理完整个请求后,应该关闭这条连接,让它归还给 SqlSessionFactory,否则数据库资源就很快被耗费精光,系统就会瘫痪,所以用 try...catch...finally... 语句来保证其正确关闭。所以 SqlSession 的最佳的作用域是请求或方法作用域。
必须要确保SqlSession 在finally 方法体中正常关闭。可以使用下面的标准方式来关闭:
SqlSession session = sqlSessionFactory.openSession(); try { // do work } finally { session.close(); }图文理解
话不多说,让一心同学直接扔一张图上来理解三者之间的关系:
接下来我们再继续看SqlSessionFactory和SqlSession之间的关系:
到这里,相信就能够理清SqlSessionFactoryBuilder,SqlSessionFactory,SqlSession之间的关系了。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)