zoukankan      html  css  js  c++  java
  • java-mybaits-00201-DAO-SqlSession使用范围

    1.SqlSession的使用范围

      SqlSession中封装了对数据库的操作,如:查询、插入、更新、删除等。
      通过SqlSessionFactory创建SqlSession,而SqlSessionFactory是通过SqlSessionFactoryBuilder进行创建。

    1.1  SqlSessionFactoryBuilder

      SqlSessionFactoryBuilder用于创建SqlSessionFacoty,SqlSessionFacoty一旦创建完成就不需要SqlSessionFactoryBuilder了,因为SqlSession是通过SqlSessionFactory生产,所以可以将SqlSessionFactoryBuilder当成一个工具类使用,最佳使用范围是方法范围即方法体内局部变量。
      将SqlSessionFactoryBuilder当成一个工具类使用即可,不需要使用单例管理SqlSessionFactoryBuilder。在需要创建SqlSessionFactory时候,只需要new一次SqlSessionFactoryBuilder即可。

    1.2  SqlSessionFactory

      SqlSessionFactory是一个接口,接口中定义了openSession的不同重载方法,SqlSessionFactory的最佳使用范围是整个应用运行期间,一旦创建后可以重复使用,通常以单例模式管理SqlSessionFactory。
      使用单例模式管理sqlSessionFactory(工厂一旦创建,使用一个实例)。 
      将来mybatis和spring整合后,使用单例模式管理sqlSessionFactory。

    1.3  SqlSession

      SqlSession是一个面向用户(程序员)的接口, sqlSession中定义了数据库操作,默认使用DefaultSqlSession实现类。
      SqlSession中提供了很多操作数据库的方法:如:selectOne(返回单个对象)、selectList(返回单个或多个对象)、。 
      SqlSession是线程不安全的,在SqlSesion实现类中除了有接口中的方法(操作数据库的方法)还有数据域属性。
      SqlSession最佳应用场合在方法体内,定义成局部变量使用。

     执行过程如下:

    1. 加载数据源等配置信息:Environment environment = configuration.getEnvironment();
    1. 创建数据库链接
    2. 创建事务对象
    3. 创建Executor,SqlSession所有操作都是通过Executor完成,mybatis源码如下:
    if (ExecutorType.BATCH == executorType) {
          executor = newBatchExecutor(this, transaction);
        } elseif (ExecutorType.REUSE == executorType) {
          executor = new ReuseExecutor(this, transaction);
        } else {
          executor = new SimpleExecutor(this, transaction);
        }
    if (cacheEnabled) {
          executor = new CachingExecutor(executor, autoCommit);
        }
    1. SqlSession的实现类即DefaultSqlSession,此对象中对操作数据库实质上用的是Executor

    结论:

             每个线程都应该有它自己的SqlSession实例。SqlSession的实例不能共享使用,它也是线程不安全的。因此最佳的范围是请求或方法范围。绝对不能将SqlSession实例的引用放在一个类的静态字段或实例字段中。
             打开一个 SqlSession;使用完毕就要关闭它。通常把这个关闭操作放到 finally 块中以确保每次都能执行关闭。如下:
             SqlSession session = sqlSessionFactory.openSession();
             try {
                      // do work
             } finally {
                    session.close();
             }
  • 相关阅读:
    python import语句
    python输出中文
    python字典的格式化字符串
    emacs查找替换
    emacs书签
    [转]Ubuntu11.10 更改登录界面背景(LightDM背景)
    ubuntu samba共享文件
    emacs笔记
    .NET登录验证码实现
    WEB标准学习实践(一)
  • 原文地址:https://www.cnblogs.com/bjlhx/p/6818879.html
Copyright © 2011-2022 走看看