二级缓存

带你了解MyBatis一二级缓存

╄→尐↘猪︶ㄣ 提交于 2020-01-28 20:20:00
在对数据库进行噼里啪啦的查询时,可能存在多次使用相同的SQL语句去查询数据库,并且结果可能还一样,这时,如果不采取一些措施,每次都从数据库查询,会造成一定资源的浪费,所以Mybatis中提供了一级缓存和二级缓存来解决这个问题,通过把第一次查询的结果保存在内存中,如果下次有同样的语句,则直接从内存中返回。 一级缓存 一级缓存的作用域在同一个SqlSession,也就是说两个一样的SQL语句,第一次会从数据库中获得,并保存在一个Map<Object, Object> 中,第二次会从这个Map中返回,Mybatis默认开启了一级缓存。 下面是代码演示 public static void main( String[] args ) { String resource = "mybatis-config.xml"; try { InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory build = new SqlSessionFactoryBuilder().build(inputStream); SqlSession sqlSession = build.openSession(); System.out.println(sqlSession.getMapper

mybatis框架学习

耗尽温柔 提交于 2020-01-27 08:15:44
1.mybatis入门知识 mybatis是一个持久层框架,所以在使用的时候一定要导入mybatis和mysql依赖。 在使用映射文件开发的时候要在配置文件中告知 mybatis 映射配置的位置,在使用注解开发的时候除了告知 mybatis 映射配置的位置,还要把IUserDao.xml文件删掉,否则会出现包扫描错误。 注解直接添加在持久层就可以 mybatis映射文件中的parameterType和resultType分别为持久层中的参数类型和返回值 2.resultMap 结果类型 返回值类型可以用resultMap进行封装,resultMap 可以实现将查询结果映射为复杂类型的 pojo,比如在查询结果映射对象中包括 pojo 和 list 实现一对一查询和一对多查询。 在使用resultMap进行封装时,映射文件也要用resultMap封装时设置的id 3.mybatis连接池 连接池就是用于存储连接的一个容器。 容器其实就是一个集合对象,该集合必须是线程安全的,不能两个线程拿到统一连接。(该集合还必须能实现队列的特性:先进先出) 在 Mybatis 的 SqlMapConfig.xml 配置文件中,通过来实现 Mybatis 中连接池的配置。 4.mybatis的动态sql 动态sql的if标签 ,if就是对其进行判断,需要注意的是空字符串要用“ ”用单引号包双引号

延迟加载与缓存

不打扰是莪最后的温柔 提交于 2020-01-26 20:22:29
一、延迟加载   1、直接加载:执行完对主加载对象的 select 语句,马上执行对关联对象的 select 查询。   2、侵入式延迟:执行对主加载对象的查询时,不会执行对关联对象的查询。但当要访问主加载对象的详情属性时,就会马上执行关联对象的select查询。     侵入式延迟的配置:       (1)配置mybatis-config.xml文件         在mybatis-config.xml文件中插入setting节点,并设置name属性和value属性值,配置lazyLoadingEnabled                (2)小配置文件中select语句必须为两条                (3)Test测试类                (4)执行结果如下(当不掉用对象中的字段或属性时只执行一条SQL)                  当调用其属性时执行的结果如下              3、深度延迟:执行对主加载对象的查询时,不会执行对关联对象的查询。访问主加载对象的详情时也不会执行关联对象的select查询。只有当真正访问关联对象的详情时,才会执行对关联对象的 select 查询。     深度延迟的配置:       (1)配置mybatis-config.xml文件,在mybatis-config.xml文件中插入setting节点

MyBatis

旧时模样 提交于 2020-01-26 03:56:51
文章目录 一、Mybatis工作原理 二、spring中配置Mybatis 三、在IDEA中添加mybatis配置文件 四、Mybatis分页插件PageHepler 五、mybatis缓存机制 一级缓存 二级缓存 一、Mybatis工作原理 1、mybatis工作原理图: 2、步骤详解: (1)配置XML文件 ​ 加载配置文件,XMLConfigBuilder对象会进行XML配置文件的解析,实际为configuration节点的解析操作,在configuration节点下会依次解析properties/settings/…/mappers等节点配置。在解析environments节点时,会根据transactionManager的配置来创建事务管理器,根据dataSource的配置来创建DataSource对象,这里面包含了数据库登录的相关信息。在解析mappers节点时,会读取该节点下所有的mapper文件,然后进行解析,并将解析后的结果存到configuration对象中。 < ? xml version = "1.0" encoding = "UTF-8" ? > < ! DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3

mybatis精讲(六)--二级缓存

强颜欢笑 提交于 2020-01-25 03:14:40
[TOC] 简介 上一章节我们简单了解了二级缓存的配置。今天我们详细分析下二级缓存以及为什么不建议使用二级缓存。 一级缓存针对的是sqlsession。二级缓存针对的是namespace层面的。 配置 之前我们已经提到了配置二级缓存以及配置自定义的二级缓存。下面我们从头开始实现二级缓存。 public Executor newExecutor(Transaction transaction, ExecutorType executorType) { executorType = executorType == null ? defaultExecutorType : executorType; executorType = executorType == null ? ExecutorType.SIMPLE : executorType; Executor executor; if (ExecutorType.BATCH == executorType) { executor = new BatchExecutor(this, transaction); } else if (ExecutorType.REUSE == executorType) { executor = new ReuseExecutor(this, transaction); } else { executor

115网盘怎么搜索资源

孤者浪人 提交于 2020-01-23 21:51:43
1、啥是 MyBatis? MyBatis 是一个半自动 ORM 持久层框架,她内部对 JDBC 做了封装,并使用 XML 或注解来配置和映射数据库信息,开发人员只需要关注 SQL 语句本身,避免了处理繁琐的数据库映射过程,使 Java 代码和 SQL 完全分离,有利于分层开发,提高开发效率和灵活性。 2、MyBatis 的优缺点和适用场景? 1)优点 基于SQL语句编程,非常灵活,不会对应用程序或者数据库的现有设计造成任何影响,SQL写在XML里,解除SQL与程序代码的耦合,便于统一管理;提供XML标签,支持编写动态SQL语句,并可重用。 与JDBC相比,减少了50%以上的代码量,消除了JDBC大量冗余的代码,不需要手动开关连接; 很好的与各种数据库兼容(因为MyBatis使用JDBC来连接数据库,所以只要JDBC支持的数据库MyBatis都支持)。 能够与Spring很好的集成; 提供映射标签,支持对象与数据库的ORM字段关系映射;提供对象关系映射标签,支持对象关系组件维护。 2)缺点 SQL语句的编写工作量较大,尤其当字段多、关联表多时。 不支持方言,数据库移植性差。 SQL存在XML文件中,调试不方便。 对动态SQL的支持不是很好,提供的标签过于简单。 由于xml里标签id必须唯一,导致DAO中方法不支持方法重载。 3)适用场景 MyBatis 解耦了 SQL 和 程序代码

Java 程序员面试笔试宝典 第 5 章 Java Web:(5.3.11-5.3.19)

烂漫一生 提交于 2020-01-22 19:32:52
5.3.11 什么是 IoC 控制反转(Inverse of Control,IoC)有时也被称为依赖注入,是一种降低对象之间耦合关系的设计思想。一般而言,在分层体系结构中,都是上层调用下层的接口,上层依赖于下层的执行,即调用者依赖于被调用者。而通过 IoC 方式,使得上层不再依赖于下层的接口,完成控制反转,使得由调用者来决定被调用者。IoC 通过注入一个实例化的对象来达到解耦和的目的。使用这种方法后,对象不会被显式地调用,而是根据需求通过 IoC 容器(例如 Spring)来提供。 采用 IoC 机制能够提高系统的可扩展性,如果对象之间通过显式调用进行交互会导致调用者与被调用者存在着非常紧密的联系,其中一方的改动将会导致程序出现很大的改动。 例如,要为一家卖茶的商店提供一套管理系统,在这家商店刚开业时只卖绿茶(GreenTea),随着规模的扩大或者根据具体销售量,未来可能会随时改变茶的类型,例如红茶(BlackTea)等,传统的实现方法会针对茶抽象化一个基类,绿茶类只需要继承自该基类即可,如图 5-12 所示。 采用该实现方法后,在需要使用 GreenTea 时只需要执行以下代码即可:AbstractTea t=new GreenTea(),当然,这种方法是可以满足当前设计要求的。但是该方法的可扩展性不好,存在着不恰当的地方,例如,商家发现绿茶的销售并不好,决定开始销售红茶

mybatis缓存之二级缓存

有些话、适合烂在心里 提交于 2020-01-22 12:22:50
二级缓存(全局缓存):基于namespace级别的缓存,一个namespace对应一个二级缓存。 工作机制: 一个会话,查询一条数据,这条数据会放在当前会话的一级缓存中; 如果会话关闭,该会话对应的一级缓存就消失了; 可以使用二级缓存将保存之前的一级缓存,新的会话要查询相同的信息就可以从二级缓存中获取。 使用过程: 开启二级缓存全局配置; <setting name="cacheEnabled" value="true"/> 在mapper.xml配置使用二级缓存<cache></cache> POJO需要实现序列化接口 <setting name="lazyLoadingEnabled" value="true"/> <mapper namespace="com.gong.mybatis.dao.EmployeeMapper"> <cache eviction="FIFO" flushInterval="60000" readOnly="false" size="1024"> <!-- eviction:缓存的回收策略,默认LRU flushInterval:缓存刷新间隔,默认不清空,可以设置一个毫秒值 readOnly:只读为true,所有从缓存中获取操作都是只读操作,不会修改数据,直接将数据在缓存中的引用交给用户; 非只读,获取的数据可能会被修改,会利用序列化

mybatis缓存

流过昼夜 提交于 2020-01-20 19:48:05
基本概念 一级缓存与session绑定,只存在于session生命周期内,从数据库中查询到的值会保存到一级缓存中,当session关闭后,会保存到二级缓存中,一级缓存默认是开启的。 二级缓存存在于sqlSessionFactory生命周期内,多个session共享二级缓存,二级缓存保障了在session关闭后,一级缓存不会浪费,不同mapper的二级缓存是分开管理的,互不影响。二级缓存需要配置才会启用 进行查询时,首先会查询二级缓存。若二级缓存未命中,再去查询一级缓存。 因为DefaultSqlSession是线程不安全的,所以规范就是不能对它进行并发调用,也就意味着一级缓存不存在并发安全问题,因为根本不会被并发调用 因为多个session共享二级缓存,所以二级缓存会被并发访问,所以需要解决并发问题和事务问题。 因为实际进行数据操作时,都是通过executor来执行的,所以一级和二级缓存都是在executor内处理。 mybatis默认使用的是CachingExecutor,它装饰了SimpleExecutor,而SimpleExecutor继承了BaseExecutor。因为一级缓存是默认开启的,所以会有CachingExecutor去装饰SimpleExecutor,不开启的话,对外暴露的就直接是SimpleExecutor了。 所以进行数据操作时

Hibernate缓存机制

こ雲淡風輕ζ 提交于 2020-01-20 02:29:52
Hibernate缓存机制 什么是缓存,为什么需要缓存? 什么是缓存? 存在内存中的临时数据 为什么需要缓存? 减少程序直接和数据库交互的次数,因为直接交互的结果集很多都是重复的,例如查询,缓存可以减少开销 什么样的数据适合缓存?什么样的数据不适合缓存? 适合缓存的数据 多次查询且很少次修改,同时修改了之后对结果的影响不大的数据 不适合缓存的数据 并发访问的数据一定不能被缓存 Hibernate一级缓存验证 Hibernate一级缓存指的是Session对象的缓存,一旦Session对象销毁了,一级缓存也就消失了,下面代码证明了一级缓存的存在: @Test public void test2(){ Configuration cfg = new Configuration(); cfg.configure(); SessionFactory factory = cfg.buildSessionFactory(); Session session = factory.openSession(); Transaction tx = session.beginTransaction(); //第一次查询,查询结果放到了一级缓存当中 User user1 = (User) session.get(User.class, 95L); //第二次查询,先从一级缓存当中查询,有的话拿过来直接用