`
leon.s.kennedy
  • 浏览: 110455 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

MyBatis范围和生命周期

 
阅读更多

理解不同范围和生命周期类是很重要的。不正确的使用它们会导致严重的并发问题

SqlSessionFactoryBuilder
这个类可以被实例化,使用和丢弃。一旦你创建了SqlSessionFactory后,这个类就不需要存在了。因此SqlSessionFactoryBuilder实例的最佳范围是方法范围(也就是本地方法变量)。你可以重用SqlSessionFactoryBuilder来创建多个SqlSessionFactory实例,但是最好的方式是不需要保持它一直存在来保证所有XML解析资源,因为还有更重要的事情要做。



SqlSessionFactory
一旦被创建,SqlSessionFactory实例应该在你的应用程序执行期间都存在。没有理由来处理或重新创建它。使用SqlSessionFactory的最佳实践是在应用程序运行期间不要重复创建多次。这样的操作将被视为是非常糟糕的。因此SqlSessionFactory的最佳范围是应用范围。有很多方法可以做到,最简单的就是使用单例模式或者静态单例模式。然而这两种方法都不认为是最佳实践。这样的话,你可以考虑依赖注入容器,比如Google Guice或Spring。这样的框架允许你创建支持程序来管理单例SqlSessionFactory的生命周期。

 

SqlSession
每个线程都应该有它自己的SqlSession实例。SqlSession的实例不能共享使用,它也是线程不安全的。因此最佳的范围是请求或方法范围。绝对不能将SqlSession实例的引用放在一个类的静态字段甚至是实例字段中。也绝不能将SqlSession实例的引用放在任何类型的管理范围中,比如Serlvet架构中的HttpSession。如果你现在正用任意的Web框架,要考虑SqlSession放在一个和HTTP请求对象相似的范围内。换句话说,基于收到的HTTP请求,你可以打开了一个SqlSession,然后返回响应,就可以关闭它了。关闭Session很重要,你应该确保使用finally块来关闭它。下面的示例就是一个确保SqlSession关闭的基本模式:
SqlSession session = sqlSessionFactory.openSession();
try {
// do work
} finally {
session.close();
}
在你的代码中一贯地使用这种模式,将会保证所有数据库资源都正确地关闭(假设你没有通过你自己的连接关闭,这会给MyBatis造成一种迹象表明你要自己管理连接资源)。

 

映射器实例
映射器是你创建绑定映射语句的接口。映射器接口的实例可以从SqlSession中获得。那么从技术上来说,当被请求时,任意映射器实例的最宽范围和SqlSession是相同的。然而,映射器实例的最佳范围是方法范围。也就是说,它们应该在使用它们的方法中被请求,然后就抛弃掉。它们不需要明确地关闭,那么在请求对象中保留它们也就不是什么问题了,这和SqlSession相似。你也许会发现,在这个水平上管理太多的资源的话会失控。保持简单,将映射器放在方法范围内。下面的示例就展示了这个实例:
SqlSession session = sqlSessionFactory.openSession();
try {
BlogMapper mapper = session.getMapper(BlogMapper.class);
// do work
} finally {
session.close();
}

分享到:
评论

相关推荐

    MyBatis(ibatis)学习文档.docx

    MyBatis的范围和生命周期是指MyBatis对象的生命周期和作用域。MyBatis的对象可以分为两种:SqlSessionFactory和SqlSession。SqlSessionFactory是一个工厂对象,用于生成SqlSession对象。SqlSession对象是MyBatis的...

    MyBatis官方中文参考手册

    2. SqlSessionFactory、SqlSession、Mapper实例的作用及其生命周期和作用范围。 3. XML映射配置文件的结构,包括properties、Settings、typeAliases、typeHandlers、objectFactory、plugins、environments、...

    MyBatis-3 User-Guide

    **范围和生命周期** - `SqlSessionFactoryBuilder`:这个类主要用于创建`SqlSessionFactory`,创建后通常不再需要,可以安全地丢弃。 - `SqlSessionFactory`:它是一个较长时间存在的对象,负责创建`SqlSession`,并...

    MyBatis培训课件

    #### 四、MyBatis 的范围和生命周期 1. **SqlSessionFactoryBuilder**:最佳范围是本地方法范围。在实际应用中,一般不会直接使用 SqlSessionFactoryBuilder,而是通过它构建出 SqlSessionFactory。 2. **...

    MyBatis3 中文版用户指南手册

    #### 范围和生命周期 - **SqlSessionFactory**:整个应用的生命周期内只需要创建一次。 - **SqlSession**:通常在一个请求或事务范围内使用一次,使用完毕后应关闭。 #### SqlSessionFactoryBuilder `...

    Java+Springboot+mybatis+sharding jdbc 实现分库分表

    在本项目中,SpringBoot作为基础框架,负责管理应用的生命周期,提供依赖注入,以及Web服务的构建。 **MyBatis**: MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有...

    mybatis课件

    SqlSession 提供了执行 SQL 和获取结果的方法,它的生命周期很短,只限于单个方法内。DefaultSqlSession 是其默认实现。 **2.3.5 UserDaoImpl 示例** 在 DAO 实现类中注入 SqlSessionFactory,并在方法体内创建 ...

    MyBatis-3.3.1

    SqlSessionFactory是线程安全的,通常在应用启动时初始化一次,然后在整个应用生命周期中重用。 2. SqlSession:它是执行数据库操作的对象,通过SqlSessionFactory获取。SqlSession提供了增删查改数据库记录的方法...

    mybatis+redis缓存配置

    - **一级缓存**:也称为本地会话缓存,它的生命周期是伴随着一次会话(SqlSession)的开始和结束。一级缓存默认开启且无法关闭,主要用于减少同一个会话内的多次数据库访问。 - **二级缓存**:也称为全局会话缓存,...

    mybatis基础及项目实战

    - 在单个请求或任务中使用`SqlSession`,确保其生命周期不要跨越多个请求。 通过上述知识点的学习,读者不仅可以深入了解MyBatis的工作原理,还能掌握如何在实际项目中运用这些知识来实现各种功能。无论是对于初学...

    MyBatis 3.5.2 参考文档.rar

    本地缓存存储单个`SqlSession`生命周期内的数据,而二级缓存则是在整个`SqlSessionFactory`范围内的共享缓存。 8. **插件支持**:MyBatis允许开发自定义插件,通过拦截器(Interceptor)实现对SQL执行过程的增强,...

    MyBatis-3-User-Guide用户手册(中文英文)

    范围和生命周期 \ 8 SqlSessionFactoryBuilder \ 8 SqlSessionFactory\ 9 SqlSession \ 9 映射器实例 \ 9 XML映射配置文件 \ 10 properties\ 10 Settings \11 typeAliases \ 12 typeHandlers \ 13 ...

    Struts+spring+mybatis+MySQL整合jar包合集

    Spring的核心是IoC(Inversion of Control)容器,它负责管理对象的生命周期和依赖关系,使得代码更加松耦合。Spring AOP则允许开发者在不修改源代码的情况下,对代码进行横切关注点(如日志、安全检查)的增强。 3...

    MyBatis 36道面试题和答案.docx

    二级缓存的生命周期跨越多个SqlSession,可以在多个线程间共享。 **MyBatis分页** MyBatis提供了多种分页方式。最基础的是使用RowBounds对象,它可以配合List接口的分页功能。另一种方式是在SQL语句中直接编写分页...

    Spring+SpringMVC+MyBatis 整合 DEMO

    在整合过程中,Spring会管理SpringMVC和MyBatis的生命周期,通过Spring的ApplicationContext加载相关配置。例如,SpringMVC的DispatcherServlet配置会引用Spring的应用上下文,以便在控制器中注入MyBatis的...

    MyBatis3用户指南中文版

    同时,也讲述了MyBatis的作用域和生命周期,包括SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession和Mapper实例的作用范围。 文档还介绍了Mapper的XML配置文件,包括属性(properties)、设置(settings)...

    struts2+spring+mybatis

    在Struts2+Spring的集成中,Spring作为应用的容器,管理Action类的生命周期,实现业务对象的注入,从而降低了组件间的耦合度。 **MyBatis** 是一个持久层框架,它简化了Java与数据库之间的交互。MyBatis允许开发者...

    MyBatis缓存(一级缓存、二级缓存)

    一级缓存的生命周期与SqlSession紧密相关。当SqlSession关闭或提交事务时,一级缓存会被清空。如果在同一个SqlSession中进行了更新、插入或删除操作,即使没有关闭SqlSession,一级缓存也会被清空,以防止返回过时的...

    封装通用的Spring3+Struts2+MyBatis3的CRUD+条件分页查询

    在本实例中,Spring负责管理Bean的生命周期和组装应用程序的各个组件,同时也可以作为事务管理器,确保数据操作的原子性和一致性。 Struts2是基于MVC设计模式的Web框架,用于处理HTTP请求并展示结果。它负责接收...

Global site tag (gtag.js) - Google Analytics