zoukankan      html  css  js  c++  java
  • Mybatis 作用域和生命周期

    一、SqlSessionFactoryBuilder

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

    二、SqlSessionFactory

    一旦创建,将会存在于您的应用程序整个运行生命周期中。很少或根本没有理由去销毁它或重新创建它。最佳实践是不要在一个应用中多次创建 SqlSessionFactory。这样做会被视为"没品味"。所是 SqlSessionFactory 最好的作用域范围是一个应用的生命周期范围。这可以由多种方式来实现,最简单的方式是使用 Singleton 模式或静态 Singleton 模式。但这不是被广泛接受的最佳做法,相反,您可能更愿意使用像 Goole 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 管理,这表明您希望自己管理连接)

    四、Mapper实例

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

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

    五、对象生命周期和依赖注入框架

    依赖注入框架可以创建线程安全的、基于事务的 SqlSession 和映射器,并将它们直接注入到你的 bean 中,因此可以直接忽略它们的生命周期。 如果对如何通过依赖注入框架使用 MyBatis 感兴趣,可以研究一下 MyBatis-Spring 或 MyBatis-Guice 两个子项目。

  • 相关阅读:
    turtle库笔记
    使用turtle库绘制一个红色五角星图形‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪
    postgresql更新sequence的起始值
    es启动报错-系统设置
    mybatis批量update
    postgresql数据库连接数查询
    org.postgresql.util.PSQLException: 栏位索引超过许可范围:1,栏位数:0。
    postgresql创建SEQUENCE
    unzip解压所有zip格式
    jdk8中map的merge方法介绍
  • 原文地址:https://www.cnblogs.com/jwen1994/p/10805904.html
Copyright © 2011-2022 走看看