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

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. DM6467开发领航-开发坏境安装

  2. 对一个前端使用AngularJS后端使用ASP.NET Web API项目的理解(2)

    chsakell分享了一个前端使用AngularJS,后端使用ASP.NET Web API的项目. 源码: https://github.com/chsakell/spa-webapi-angula ...

  3. Delphi处理Android的路径信息

    路径操作就使用TPath的方法都很方便.usesSystem.IoUtilsTPath.GetTempPath//临时目录TPath.GetCameraPath//照相机目录(照片/录像)TPath. ...

  4. ASIHTTPRequestErrorDomain Code=5

    ASIHttpRequest解析带空格的URL时 出错!!!(已解决) 用的是post请求 URL 地址是: http://111.234.51.56/login_member.pl?time=201 ...

  5. NSDictionary 详解

    1.使用dictionaryWithObjectsAndKeys方法存储数据时,中间任何一个对象都不能为nil,否则它后面都对象都无法存入aFiledic.因为dictionaryWithObject ...

  6. 递归搜寻NSString中重复的文本

    递归搜寻NSString中重复的文本 效果 源码 https://github.com/YouXianMing/iOS-Project-Examples 中的 StringRange 项目 // // ...

  7. jquery入门 改动网页背景颜色

    我们在浏览一些站点,尤其是一些小说站点的时候,都会有改动页面背景颜色的地方,这个功能使用jquery非常easy实现. 效果图: show you code: <!doctype html> ...

  8. Java中CAS详解

    在JDK 5之前Java语言是靠synchronized关键字保证同步的,这会导致有锁 锁机制存在以下问题: (1)在多线程竞争下,加锁.释放锁会导致比较多的上下文切换和调度延时,引起性能问题. (2 ...

  9. [转]XCache 3.0.0 发布,PHP 性能提升方案

    From : http://www.oschina.net/news/34304/xcache-3-0-0 XCache 3.0.0 发布,该版本除了 bug 修复,对 XCache 管理页面做了很多 ...

  10. Intelli系列代理部分报错:You have JVM property https.proxyHost set..

    You have JVM property https.proxyHost set to '...'. This may lead to incorrect behaviour. Proxy shou ...