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();
             }
  • 相关阅读:
    JavaEE——SpringMVC(11)--拦截器
    JavaEE——SpringMVC(10)--文件上传 CommonsMultipartResovler
    codeforces 460A Vasya and Socks 解题报告
    hdu 1541 Stars 解题报告
    hdu 1166 敌兵布阵 解题报告
    poj 2771 Guardian of Decency 解题报告
    hdu 1514 Free Candies 解题报告
    poj 3020 Antenna Placement 解题报告
    BestCoder5 1001 Poor Hanamichi(hdu 4956) 解题报告
    poj 1325 Machine Schedule 解题报告
  • 原文地址:https://www.cnblogs.com/bjlhx/p/6818879.html
Copyright © 2011-2022 走看看