码迷,mamicode.com
首页 > 数据库 > 详细

SqlSessionFactoryBuilder、SqlSessionFactory和SqlSession的作用域以及生命周期

时间:2021-05-24 02:38:08      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:nec   存在   builder   注意   连接池   管理   多线程   静态   connect   

注意:对象生命周期和依赖注入框架

      依赖注入框架可以创建线程安全的,事务性的SqlSession和映射器,并将它们直接注入到bean中,这样您就可以忽略它们的生命周期。 您可能想看看MyBatis-Spring或MyBatis-Guice子项目,以了解有关将MyBatis与DI框架一起使用的更多信息。

SqlSessionFactoryBuilder
        可以实例化,使用和丢弃此类。 创建SqlSessionFactory后,无需保留它。 因此,SqlSessionFactoryBuilder实例的最佳范围是方法范围(即本地方法变量)。 您可以重用SqlSessionFactoryBuilder来构建多个SqlSessionFactory实例,但是仍然最好不要保留它,以确保释放所有XML解析资源用于更重要的事情。

SqlSessionFactory
        创建之后,SqlSessionFactory应该在应用程序执行期间存在。 应该几乎没有或根本没有理由要处理或重新创建它。 最佳实践是不要在应用程序运行中多次重建SqlSessionFactory。 因此,SqlSessionFactory的最佳范围是应用程序范围。 这可以通过多种方式实现。 最简单的是使用Singleton模式或Static Singleton模式。

SqlSession
        SqlSession是一个会话,相当于JDBC的一个Connection对象,它的生命周期应该是在请求数据库处理事务的过程中。它是一个线程不安全的对象,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域。在涉及多线程的时候我们需要特别的当心,操作数据库需要注意其隔离级别,数据库锁等高级特性。绝对不能将 SqlSession 实例的引用放在一个类的静态域,甚至一个类的实例变量也不行。 也绝不能将 SqlSession 实例的引用放在任何类型的托管作用域中,比如 Servlet 框架中的 HttpSession。如果您使用任何类型的Web框架,请考虑SqlSession遵循与HTTP请求相似的作用域。换句话说,每次收到的 HTTP 请求,就可以打开SqlSession,返回一个响应,然后就可以将其关闭。它长期存在就会使数据库连接池的活动资源减少,对系统性能的影响很大。 结束会话非常重要,应始终确保在finallly语句块中将其关闭。它存在于一个应用的请求和操作,可以执行多条SQL,保证事务的一致性。

Mapper实例

      映射器是一些由你创建的、绑定你映射的语句的接口。映射器接口的实例是从 SqlSession 中获得的。因此从技术层面讲,任何映射器实例的最大作用域是和请求它们的 SqlSession 相同的。尽管如此,映射器实例的最佳作用域是方法作用域。 也就是说,映射器实例应该在调用它们的方法中被请求,用过之后即可丢弃。 并不需要显式地关闭映射器实例,尽管在整个请求作用域保持映射器实例也不会有什么问题,但是你很快会发现,像 SqlSession 一样,在这个作用域上管理太多的资源的话会难于控制。 为了避免这种复杂性,最好把映射器放在方法作用域内。

SqlSessionFactoryBuilder、SqlSessionFactory和SqlSession的作用域以及生命周期

标签:nec   存在   builder   注意   连接池   管理   多线程   静态   connect   

原文地址:https://www.cnblogs.com/easyjie/p/14746998.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!