zoukankan      html  css  js  c++  java
  • Mybatis介绍

    1.  Mybatis初始化过程

     所有框架在初始化的时候都要加载该框架需要的一些配置文件,Mybatis也不例外,需要加载一些配置文件;如下所示

    那配置文件加载到哪呢?答案是Configuration,Configuration是配置文件的容器,各种配置信息都会放到Configuration对象里面;

    String resource = "mybatis-config.xml";

    InputStream inputStream = Resources.getResourceAsStream(resource);

    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

    SqlSession sqlSession = sqlSessionFactory.openSession();

    List list = sqlSession.selectList("com.foo.bean.BlogMapper.queryAllBlogInfo");

    这几条语句首先初始化Mybatis,生成SqlSession实例,接着执行sql语句

    总的来说是读取Mybatis配置文件,解析配置文件生成Configuration实例,在使用Configuration对象生成sqlsession实例;使用SqlSessionFactoryBuilder创建SqlSessionFactory,SqlSessionFactory又openSession(),创建数据库连接;

    2.  数据源DataSource的分类

            

    pooled:使用连接池的数据源

    unpooled:不是连接池;

    3.  什么时候创建DataSource?什么时候创建Connection对象?

             在Mybatis初始化的时候就创建了DataSource,在

    List list = sqlSession.selectList("com.foo.bean.BlogMapper.queryAllBlogInfo");才创建Connection对象;

    4.  Connection的建立非常消耗时间,对于高并发系统来说需要使用数据库连接池解决效率问题,pooledDataSource实现原理:使用PooledState来当做连接池的容器,该容器中保存两种队列:idleConnections(空闲队列),activeConnections(活跃队列),当需要连接时,从idleConnections中取出,然后放到activeConnections队列中;当idleConnections中没有Connection对象且activeConnections中未满,那就创建新的Connection。

     5.  Mybatis事务管理

             此处的事务管理就是数据库中的数据管理。事物就是若干个操作要么全部完成,如果有一个操作出现了错误,那么其他的都要回滚;接口Transtation的实现类有JDBCTransaction和ManagerdTransaction,这两个类也是使用工厂模式创建的;具体的初始化也是在Mybatis初始化的时候给定的;

    6.  Mybatis一级缓存

             Mybatis和数据库交互之前需要建立一个数据库会话,也就是SqlSession对象,在这一次会话当中,可能会执行一个完全相同的查询若干次,从数据库中查询数据非常浪费时间(数据很有可能存储在磁盘上,系统要进行io操作,就非常浪费时间了),那现在我们为每个SqlSession对象创建一个缓存Cache,专门用来保存查询数据的结果。每次查询,先到缓存中查询,看是否能够命中,如果找不到数据,才到数据库中查询.更具体的,SqlSession对数据库的所有操作都会委托给Executor去执行,同样, Executor也维护Cache对象。其中,Cache内部是通过一个HashMap<key,value>来实现的。

             那Cache大小有限制吗?也就是对我们缓存的数据多少有限制吗?

             答案是没有,Mybatis的一级缓存设计比较简单,另外原因是缓存可能并不能持续很久(也就是生命周期可能不长);

      (a)SqlSession调用close()方法,一级缓存会释放掉;

      (b)数据库进行了更新操作(insert,delete,update),一级缓存还是会被释放掉;

      (c)会话结束。上述操作都会释放掉缓存。

    7.  Mybatis二级缓存

        MyBatis的二级缓存是Application级别的缓存,它可以提高对数据库查询的效率,以提高应用的性能。

      可以看到,Mybatis一级缓存是SqlSession级别的,每个SqlSession都有一个缓存,而二级缓存是全局级别的,以每个namespace为单位;二级缓存的实现是在Executor的基础上,Executor通过装饰者模式生成CachingExecutor。对于每次查询请求,SqlSession先使用CachingExecutor到二级缓存中查询,如果查询不到在使用Executor查询,之后CachingExecutor会将查询结果放到二级缓存中,然后将结果返回给SqlSession。

    8.  DataSource和Transaction都是使用工厂模式完成的,那工厂的类图是怎样的?

  • 相关阅读:
    BloomFilter——读数学之美札记
    线性时间求最长回文子串
    python之装饰器详解
    多线程快速排序(思考)
    搬家
    webapp用户身份认证方案 JSON WEB TOKEN 实现
    Java多线程问题总结
    synchronized的4种用法
    线程池的工作原理及使用示例
    Http 请求 GET和POST的区别
  • 原文地址:https://www.cnblogs.com/zhihuayun/p/7272012.html
Copyright © 2011-2022 走看看