MyBatis 作用域和生命周期

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

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();
}

来源: http://www.phperz.com/article/15/0606/132847.html

null

时间: 2024-10-13 12:45:52

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

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

SqlSession及其工厂类的作用域和生命周期 SqlSession创建流程: 使用SqlSessionFactoryBuilder创建SqlSessionFactory. 使用SqlSessionFactory创建SqlSession. SqlSession可以通过Sql Mapper.class进行数据库操作,或者直接使用SqlSession的方法输入SqlMapper.方法()进行数据库操作,使用完要关闭. SqlSessionFactoryBuilder 就是SqlSessionFac

文件载入流程,函数的使用【函数名,参数【按引用赋值的问题】,函数体,【变量作用域和生命周期】】

1.求最大公约数辗转相除求值例如:12,8求最大公约数12%8=4[不为零]8%4=0[为零,则4为最大公约数][原理就是12,8的最大公约数和8,4的最大公约数一致][这个问题已经可被证明]计算机中最早的算法 2.文件载入---流程[php执行的先后顺序][php对代码的编译以文件为单位]先检查一个文件中的语法再进行编译然后才会一行行解释执行 [这一点需要注意]这里进行文件载入的流程讲解:php文件载入时,被引入的文件中的语法并不会解析,只有当该文件被执行[也就是被引入语句之后的部分才会报错]

嵌入式 Linux C语言(八)——存储类型、作用域、生命周期、链接属性

嵌入式 Linux C语言(八)--存储类型.作用域.生命周期.链接属性 一.存储类型 C语言中,每个变量和函数都有两个属性:数据类型和数据的存储类型. 变量的存储类型是指存储变量值的内存类型.变量的存储类型决定变量何时创建.何时销毁以及它的值将保持多久.计算机中有三个地方可以用于存储变量:普通内存,运行时堆和栈,硬件寄存器.变量的存储类型取决于声明变量的位置. C语言存储类别说明符: 说明符 用    法 auto 只在代码块内变量声明中被允许, 表示变量具有本地生存期 extern 出现在顶

存储类、作用域、生命周期、链接属性

1.linux下C语言程序的内存映像代码段(.text).数据段(.data).bss段.栈.堆的概念 代码段(.text) (1)对应着程序中的代码(函数),代码段在linux中又叫文本段(.text)(2)部分平台下的const修饰的变量. 数据段(.data) 1.显式初始化为非0的全局变量: 2.显式初始化为非0的static局部变量 bss段 1.显式初始化为0或者未显式初始化的全局变量: 2.显式初始化为0或未显式初始化的static局部变量. 栈 局部变量分配在栈上:函数调用传参过

C++中的作用域与生命周期

Pascal之父Nicklaus Wirth曾经提出一个公式,展示出了程序的本质:程序=算法+数据结构.后人又给出一个公式与之遥相呼应:软件=程序+文档.这两个公式可以简洁明了的为我们展示程序和软件的组成. 程序的运行过程可以理解为算法对数据的加工过程,程序的运行的结果,就是算法加工数据产生的结果数据.算法描述的是对数据加工的步骤,对应于程序中的函数.数据结构描述的是数据在计算机中的组织结构,对应于程序中的数据类型.程序中数据对应的就是无处不在变量.对于我们编程人员,面对的无非就是函数,数据类型

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

全局变量 作用域:全局作用域(全局变量只需在一个源文件中定义,就可以作用于所有的源文件.) 生命周期:程序运行期一直存在 引用方法:其他文件中要使用必须用extern 关键字声明要引用的全局变量. 内存分布:全局数据区 注意:如果在两个文件中都定义了相同名字的全局变量,连接出错:变量重定义 全局静态变量 作用域:文件作用域(只在被定义的文件中可见.) 生命周期:程序运行期一直存在 内存分布:全局数据区 定义方法:static关键字,const 关键字 注意:只要文件不互相包含,在两个不同的文件中

7、C_存储类 & 作用域 & 生命周期 & 链接属性

概念解析 存储类 存储类就是存储类型,也就是描述C语言变量在何种地方存储. 内存有多种管理方法:栈.堆.数据段.bss段..text段······一个变量的存储类属性就是描述这个变量存储在何种内存段中. 譬如:局部变量分配在栈上,所以它的存储类就是栈:显式初始化为非0的全局变量分配在数据段,显式初始化为0和没有显示初始化(默认为0)的全局变量分配在bss段. 作用域 作用域是描述这个变量起作用的代码范围. 基本来说,C语言变量的作用域规则是代码块作用域.意思就是这个变量起作用的范围是当前的代码块

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

在前面博客中提到容器启动获得BeanDefinition对象中有一个scope 属性.该属性控制着bean对象的作用域.本章节介绍Bean的作用域及生命周期,了解bean是怎么来的又怎么没的. 一.Bean的作用域在Bean容器启动会读取bean的xml配置文件,然后将xml中每个bean元素分别转换成BeanDefinition对象.在BeanDefinition对象中有scope 属性,就是它控制着bean的作用域.Spring框架支持5种作用域,有三种作用域是当开发者使用基于web的App

spring作用、spring注解、管理对象的作用域与生命周期、自动装配

Spring 1. 作用 创建和管理对象,使得开发过程中,可以不必使用new关键字创建对象,而是直接获取对象!并且,还可以通过一些配置,使得某些获取到的对象,其中某些属性已经是被赋值的! 2. Spring注解 在Spring中,定义了一系列的注解,可以取代几乎所有的XML配置! 尽管使用注解可以完成此前的许多配置,但是,基于Spring的项目仍需要Spring的配置文件! 2.1. 常用注解 使用注解的方式来创建和管理对象,首先,必须在Spring的配置文件中添加组件扫描: <!-- 组件扫描