理解到目前为止所讨论的类的作用域和生命周期是非常重要的。如果使用不当可导致严重的并发性问题。

SqlSessionFactoryBuilder
 
这个类可以在任何时候被实例化、使用和销毁。一旦您创造了SqlSessionFactory 就不需要
再保留它了。所以SqlSessionFactoryBuilder 实例的最好的作用域是方法体内(即一个本地方法
变量)。您能重用SqlSessionFactoryBuilder 创建多个SqlSessionFactory 实例,但最好不要把
时间、资源放在解析XML 文件上,而是要从中解放出来做最重要事情。

SqlSessionFactory
 
一旦创建,SqlSessionFactory 将会存在于您的应用程序整个运行生命周期中。很少或根本
没有理由去销毁它或重新创建它。最佳实践是不要在一个应用中多次创建SqlSessionFactory。
这样做会被视为“没品味”。所是SqlSessionFactory 最好的作用域范围是一个应用的生命周期
范围。这可以由多种方式来实现,最简单的方式是使用Singleton 模式或静态Singleton 模式。
但这不是被广泛接受的最佳做法,相反,您可能更愿意使用像Google Guice 或Spring 的依赖注
入方式。这些框架允许您创造一个管理器,用于管理SqlSessionFactory 的生命周期。

SqlSession
 
每个线程都有一个SqlSession 实例,SqlSession 实例是不被共享的,并且不是线程安全
的。因此最好的作用域是request 或者method。决不要用一个静态字段或者一个类的实例字段来
保存SqlSession 实例引用。也不要用任何一个管理作用域,如Servlet 框架中的HttpSession,
来保存SqlSession 的引用。如果您正在用一个WEB 框架,可以把SqlSession 的作用域看作类似
于HTTP 的请求范围。也就是说,在收到一个HTTP 请求,您可以打开一个SqlSession,当您把
response 返回时,就可以把SqlSession 关闭。关闭会话是非常重要的,您应该要确保会话在一
个finally 块中被关闭。
 

SqlSession session = sqlSessionFactory.openSession();
try {
// do work
} finally {
session.close();
}
在您的代码里都使用这一模式将保证所有的数据库资源被正确地关闭(假如您没有把您自己
的数据库连接传递给MyBatis 管理,这就对MyBatis 表明您希望自己管理连接)。

Mapper 实例
 
Mappers 是创建来绑定映射语句的接口,该Mapper 实例是从SqlSession 得到的。因此,所
有mapper 实例的作用域跟创建它的SqlSession 一样。但是,mapper 实例最好的作用域是
method,也就是它们应该在方法内被调用,使用完即被销毁。并且mapper 实例不用显式地被关
闭。虽然把mapper 实例保持在一个request 范围(与SqlSession 相似)不会产生太大的问题,
但是您可能会发现,在这个层次上管理太多资源可能会失控。保持简单,就是让Mappers 保持在
一个方法内。下面的例子演示了这种做法。
 

SqlSession session = sqlSessionFactory.openSession();
try {
BlogMapper mapper = session.getMapper(BlogMapper.class);
// do work
} finally {
session.close();
}

MyBatis 作用域和生命周期的更多相关文章

  1. Mybatis学习-配置、作用域和生命周期

    核心配置文件:Mybatis-config.xml Mybatis的配置文件包含了会深深影响Mybatis行为的设置和属性信息 配置(configuration) 在mybatis-config.xm ...

  2. 学习MyBatis必知必会(5)~了解myBatis的作用域和生命周期并抽取工具类MyBatisUtil、mybatis执行增删改查操作

    一.了解myBatis的作用域和生命周期[错误的使用会导致非常严重的并发问题] (1)SqlSessionFactoryBuilder [ 作用:仅仅是用来创建SqlSessionFactory,作用 ...

  3. MyBatis(四):SqlSession及其工厂类的作用域和生命周期

    本文是按照狂神说的教学视频学习的笔记,强力推荐,教学深入浅出1便就懂!b站搜索狂神说即可 https://space.bilibili.com/95256449?spm_id_from=333.788 ...

  4. Mybatis核心类生命周期和管理

    Mybatis核心类生命周期和管理 原文链接:https://blog.csdn.net/qq1134550437/article/details/51960480 1.SqlSessionFacto ...

  5. Spring中Bean的作用域、生命周期

                                   Bean的作用域.生命周期 Bean的作用域 Spring 3中为Bean定义了5中作用域,分别为singleton(单例).protot ...

  6. 《征服 C 指针》摘录2:C变量的 作用域 和 生命周期(存储期)

    在开发一些小程序的时候,也许我们并不在意作用域的必要性.可是,当你书写几万行,甚至几十万行的代码的时候,没有作用域肯定是不能忍受的. C 语言有如下 3 种作用域. 1.全局变量 在函数之外声明的变量 ...

  7. C/C++——C++变量的作用域与生命周期,C语言中变量的作用域和生命周期

    全局变量 作用域:全局作用域(全局变量只需在一个源文件中定义,就可以作用于所有的源文件.) 生命周期:程序运行期一直存在 引用方法:其他文件中要使用必须用extern 关键字声明要引用的全局变量. 内 ...

  8. C语言 变量的作用域和生命周期(转)

    转自 https://blog.csdn.net/u011616739/article/details/62052179 a.普通局部变量 属于某个{},在{}外部不能使用此变量,在{}内部是可以使用 ...

  9. Spring之Bean的作用域与生命周期

    在前面博客中提到容器启动获得BeanDefinition对象中有一个scope 属性.该属性控制着bean对象的作用域.本章节介绍Bean的作用域及生命周期,了解bean是怎么来的又怎么没的. 一.B ...

随机推荐

  1. [Winform]setupfactory制作安装包卸载输入密码进行验证

    摘要 项目有这样一个需求,在体验机上安装了一个软件,如果有用户卸载的时候,给与输入密码验证的提示,当然强制删除软件所在目录除外.那么这个有办法实现吗? 解决办法 在卸载的时候,用户单击下一步的时候进行 ...

  2. 【iOS开发-91】GCD的同步异步串行并行、NSOperation和NSOperationQueue一级用dispatch_once实现单例

    (1)GCD实现的同步异步.串行并行. --同步sync应用场景:用户登录,利用堵塞 --串行异步应用场景:下载等耗时间的任务 /** * 由于是异步.所以开通了子线程.可是由于是串行队列,所以仅仅须 ...

  3. java根据模板HTML动态生成PDF

    原文:https://segmentfault.com/a/1190000009160184 一.需求说明:根据业务需要,需要在服务器端生成可动态配置的PDF文档,方便数据可视化查看. 二.解决方案: ...

  4. IOS开发之——objective-c与javascript交互

    原文:http://blog.csdn.net/pjk1129/article/details/6936545 在写 JavaScript 的时候,可以使用一个叫做 window 的对象,像是我们想要 ...

  5. arcgispro字段计算器

    使用python语法 在python中没有类似sub()或者subString()的方法,但是字符串的截取操作却是更加简单. 只需要把字符串看作是一个字符数组,截取子串非常方便. 多余的话就不啰嗦了, ...

  6. bean validation 技术规范

    Bean Validation 技术规范特性概述 张 冠楠 和 陈 志娴2011 年 3 月 24 日发布 WeiboGoogle+用电子邮件发送本页面 2 概述 Bean Validation 规范 ...

  7. 犯罪心理第八季/全集Criminal Minds迅雷下载

    本季Criminal Minds Season 8(2012)看点:新季预告一名犯人突发急病,他被送上救护车,救护车在途中发生车祸.犯人对押送他的警官痛下毒手,BAU小组成员再次聚集起来.BAU开始分 ...

  8. Leetcode刷题记录:编码并解码短网址

    题目要求 编写一个类,提供两个方法.一个可以将普通的网址编码成短网址,一个可以将短网址还原为普通网址. 参考题解 # 使用随机函数,生成短网址,保存在dict中,避免重复 import random ...

  9. Asp.Net Core获取请求信息/获取请求地址

     一.Asp.Net Core 2.0版本中目前HttpRequest是个抽象类 在控制器或视图上下文中获取到的 Request对象,是 DefaultHttpRequest的实例. 定义 如图 : ...

  10. HTML5 本地文件操作之FileSystemAPI实例(四)

    目录操作Demo二 1.删除目录 window.requestFileSystem = window.requestFileSystem || window.webkitRequestFileSyst ...