深层剖析java应用开发中MyBayis缓存

目录
  • 什么是 MyBatis 缓存
  • MyBatis 缓存分类
    • 1、⼀级缓存:SqlSession 级别,默认开启,并且不能关闭。(默认开启)
    • 2、二级缓存:Mapper 级别,默认关闭,可以开启。
  • 二级缓存如何使用
    • 1、MyBatis 自带的二级缓存
      • 1.1config.xml 配置开启⼆级缓存
      • 1.2Mapper.xml 中配置⼆级缓存
      • 1.3实体类实现序列化接口
    • 2、ehcache 二级缓存(第三方)
      • 2.1pom.xml 添加相关依赖
      • 2.2添加 ehcache.xml
      • 2.3config.xml 配置开启⼆级缓存
      • 2.4 Mapper.xml 中配置⼆级缓存

什么是 MyBatis 缓存

使⽤缓存可以减少 Java 应⽤与数据库的交互次数,从而提升程序的运行效率。⽐如查询出 id = 1 的对象,第⼀次查询出之后会自动将该对象保存到缓存中,当下⼀次查询时,直接从缓存中取出对象即可, 无需再次访问数据库。

MyBatis 缓存分类

1、⼀级缓存:SqlSession 级别,默认开启,并且不能关闭。(默认开启)

操作数据库时需要创建 SqlSession 对象,在对象中有⼀个 HashMap ⽤于存储缓存数据,不同的 SqlSession 之间缓存数据区域是互不影响的。 ⼀级缓存的作用域是 SqlSession 范围的,当在同⼀个 SqlSession 中执⾏两次相同的 SQL 语句事,第⼀ 次执行完毕会将结果保存到缓存中,第⼆次查询时直接从缓存中获取。 需要注意的是,如果 SqlSession 执行了 DML 操作(insert、update、delete),MyBatis 必须将缓存清空以保证数据的准确性。

2、二级缓存:Mapper 级别,默认关闭,可以开启。

使⽤⼆级缓存时,多个 SqlSession 使⽤同⼀个 Mapper 的 SQL 语句操作数据库,得到的数据会存在⼆ 级缓存区,同样是使⽤ HashMap 进⾏数据存储,相⽐较于⼀级缓存,⼆级缓存的范围更⼤,多个 SqlSession 可以共⽤⼆级缓存,⼆级缓存是跨 SqlSession 的。 ⼆级缓存是多个 SqlSession 共享的,其作⽤域是 Mapper 的同⼀个 namespace,不同的 SqlSession 两次执⾏相同的 namespace 下的 SQL 语句,参数也相等,则第⼀次执⾏成功之后会将数据保存到⼆级 缓存中,第⼆次可直接从⼆级缓存中取出数据。

二级缓存如何使用

1、MyBatis 自带的二级缓存

1.1config.xml 配置开启⼆级缓存

settings>
 <!-- 打印SQL-->
 <setting name="logImpl" value="STDOUT_LOGGING" />
 <!-- 开启延迟加载 -->
 <setting name="lazyLoadingEnabled" value="true"/>
 <!-- 开启⼆级缓存 -->
 <setting name="cacheEnabled" value="true"/>
</settings>

1.2Mapper.xml 中配置⼆级缓存

<cache></cache>

1.3实体类实现序列化接口

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Account implements Serializable {
 private long id;
 private String username;
 private String password;
 private int age;
}

2、ehcache 二级缓存(第三方)

2.1pom.xml 添加相关依赖

<dependency>
 <groupId>org.mybatis</groupId>
 <artifactId>mybatis-ehcache</artifactId>
 <version>1.0.0</version>
</dependency>
<dependency>
 <groupId>net.sf.ehcache</groupId>
 <artifactId>ehcache-core</artifactId>
 <version>2.4.3</version>
</dependency>

2.2添加 ehcache.xml

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">
 <diskStore/>
 <defaultCache
 maxElementsInMemory="1000"
 maxElementsOnDisk="10000000"
 eternal="false"
 overflowToDisk="false"
 timeToIdleSeconds="120"
 timeToLiveSeconds="120"
 diskExpiryThreadIntervalSeconds="120"
 memoryStoreEvictionPolicy="LRU">
 </defaultCache>
</ehcache>

2.3config.xml 配置开启⼆级缓存

<settings>
 <!-- 打印SQL-->
 <setting name="logImpl" value="STDOUT_LOGGING" />
 <!-- 开启延迟加载 -->
 <setting name="lazyLoadingEnabled" value="true"/>
 <!-- 开启⼆级缓存 -->
 <setting name="cacheEnabled" value="true"/>
</settings>

2.4 Mapper.xml 中配置⼆级缓存

<cache type="org.mybatis.caches.ehcache.EhcacheCache">
 <!-- 缓存创建之后,最后⼀次访问缓存的时间⾄缓存失效的时间间隔 -->
 <property name="timeToIdleSeconds" value="3600"/>
 <!-- 缓存⾃创建时间起⾄失效的时间间隔 -->
 <property name="timeToLiveSeconds" value="3600"/>
 <!-- 缓存回收策略,LRU表示移除近期使⽤最少的对象 -->
 <property name="memoryStoreEvictionPolicy" value="LRU"/>
</cache>

以上就是深层剖析java开发中MyBayis缓存的详细内容,更多关于Mybatis缓存剖析的资料请关注我们其它相关文章!

(0)

相关推荐

  • 深入理解MyBatis中的一级缓存与二级缓存

    前言 先说缓存,合理使用缓存是优化中最常见的,将从数据库中查询出来的数据放入缓存中,下次使用时不必从数据库查询,而是直接从缓存中读取,避免频繁操作数据库,减轻数据库的压力,同时提高系统性能. 一级缓存 一级缓存是SqlSession级别的缓存.在操作数据库时需要构造sqlSession对象,在对象中有一个数据结构用于存储缓存数据.不同的sqlSession之间的缓存数据区域是互相不影响的.也就是他只能作用在同一个sqlSession中,不同的sqlSession中的缓存是互相不能读取的. 一级缓

  • mybatis中的一级缓存深入剖析

    mybatis中提供有一级缓存 和 二级缓存,这里记录一下一级缓存 一级缓存(mybatis中默认开启) SqlSession级别的缓存,操作数据库时需要构造SQLSession对象, 在对象中有一个数据结构(HashMap)用于存储缓存数据,不同的SQLSession对象之间的缓存数据是不共享的,即独立的 根据第一点,简单一点讲就是一级缓存是属于对象的(个人记法) 从别处搞来一个图,便于我们理解: 下面用spring整合mybatis来测试一下mybatis的一级缓存: 1.下面是servic

  • 详解Mybatis的缓存

    Mybatis的缓存 mybatis是一个查询数据库的封装框架,主要是封装提供灵活的增删改sql,开发中,service层能够通过mybatis组件查询和修改数据库中表的数据:作为查询工具,mybatis有使用缓存,这里讲一下mybatis的缓存相关源码. 缓存 在计算机里面,任何信息都有源头,缓存一般指源头信息读取后,放在内存或者其他读取较快的地方,下次读取相同信息不去源头查询而是直接从内存(或者能快速存取的硬件)读取.这样可以减少硬件使用,提高读取速度. mybatis也是这样,查询数据库的

  • mybatis中的缓存问题解析

    关于mybatis基础我们前面几篇博客已经介绍了很多了,今天我们来说一个简单的问题,那就是mybatis中的缓存问题.mybatis本身对缓存提供了支持,但是如果我们没有进行任何配置,那么默认情况下系统只开启了一级缓存,一级缓存就是同一个SqlSession执行的相同查询是会进行缓存的,OK,那么今天我们就来看看这些缓存,并简单验证下. 系统默认开启了一级缓存 这个缓存系统默认情况下是开启的,当我们获取到一个SqlSession对象之后,如果调用SqlSession中的同一个方法查询同一条数据,

  • Mybatis延迟加载和缓存深入讲解

    一.Mybatis中的延迟加载 1.延迟加载背景:Mybatis中Mapper配置文件中的resultMap可以实现高级映射(使用association.collection实现一对一及一对多(多对多)映射),同样的association.collection具备延迟加载功能.所谓延迟加载,就是先单表查询,需要时再从关联表去关联查询(同样也可能只是是单表查询),大大单表查询速度更快,所以可以间接的提高数据库性能 2.在mybatis核心配置文件中配置,其中lazyLoadingEnabled表示

  • 深层剖析java应用开发中MyBayis缓存

    目录 什么是 MyBatis 缓存 MyBatis 缓存分类 1.⼀级缓存:SqlSession 级别,默认开启,并且不能关闭.(默认开启) 2.二级缓存:Mapper 级别,默认关闭,可以开启. 二级缓存如何使用 1.MyBatis 自带的二级缓存 1.1config.xml 配置开启⼆级缓存 1.2Mapper.xml 中配置⼆级缓存 1.3实体类实现序列化接口 2.ehcache 二级缓存(第三方) 2.1pom.xml 添加相关依赖 2.2添加 ehcache.xml 2.3config

  • Java 后端开发中Tomcat服务器运行不了的五种解决方案

    目录 方法一 方法二 方法三 方法四 方法五 方法一 查看Servers项目是否被关闭或者被删除,Servers是tomcat部署环境的配置项目,我们自己的项目能不能部署在Tomcat服务器上,Servers至关重要.观察该项目是否出于打开的状态: 方法二 查看Servers组件中的tomcat服务器中是否存在太多的被运行执行过的项目,如果存在,需要删除一些不再需要被运行的项目,保留当前需要运行的某个项目即可,因为保留太多的项目会增加tomcat服务器的运行时检索的压力,拖慢运行时间,如果其他项

  • java微信开发中的地图定位功能

    页面代码: <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+&q

  • java 后台开发中model与entity(实体类)的区别说明

    以前在做项目的时候不太了解model与entity的含义,在公司(卓~)项目中学习到了.model的字段>entity的字段,并且model的字段属性可以与entity不一致,model是用于前端页面数据展示的,而entity则是与数据库进行交互做存储用途. 举个例子: 比如在存储时间的类型时,数据库中存的是datetime类型,entity获取时的类型是Date()类型,date型的数据在前端展示的时候必须进行类型转换(转为String类型),在前端的进行类型转换则十分的麻烦,转换成功了代码也

  • Java项目开发中实现分页的三种方式总结

    目录 前言 使用 1.SpringDataJPA分页 2.MyBatis分页 3.Hutools工具类分页 总结 前言 Java项目开发中经常要用到分页功能,现在普遍使用SpringBoot进行快速开发,而数据层主要整合SpringDataJPA和MyBatis两种框架,这两种框架都提供了相应的分页工具,使用方式也很简单,可本人在工作中除此以外还用到第三种更方便灵活的分页方式,在这里一同分享给大家. 使用 主要分为SpringDataJPA分页.MyBatis分页.Hutools工具类分页几个部

  • Java Web开发中过滤器和监听器使用详解

    目录 1 Filter 1.1 Filter简介 1.2 Filter的快速入门 1.2.1 创建Filter类 1.2.2 访问index.jsp 1.3 Filter的拦截路径的配置 1.4 过滤器链 1.4.1 过滤器链简介 1.4.2 过滤器链的例子 2 Listener 2.1 概念 2.2 监听器的使用 1 Filter 1.1 Filter简介 Filter表示过滤器,是JavaWeb三大组件(Servlet.Filter.Listener)之一. 过滤器可以把资源的请求拦截下来,

  • java web开发中获取tomcat上properties文件内容的方法

    在java web开发的时候经常会用到读取读取或存放文件,这个文件的默认路径在哪里呢?写死在程序里面显然是可以的,但这样子不利于位于,假如有一天项目从window移植到linux,或者保存文件的路径变了,就需要去源代码中查找,进行替换,这样子不仅效率低,而且程序的耦合度也会过高,这里我用了一个properties文件用于存放文件的保存路径,需要保存或者读取都来自己properties所保存的路径. 1.我存放的propeities文件路径 因为linux和window上面的分盘是不一样的,所以我

  • Java web开发中加载图片路径的两种方式

    (1)   src="/image/1_it.jpg" (2)   src="http://localhost:8080/image/1_it.jpg" 其中localhost可以换位你的电脑IP,端口号也要相应改变. 以上均在基于编译器idea以及tomcat服务器开发的web中测试可行!都是要先定位到项目的位置! 以上所述是小编给大家介绍的Java web开发加载图片路径的两种方式,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

  • java web开发中大量数据导出Excel超时(504)问题解决

    import java.io.IOException; import java.io.OutputStream; import java.lang.reflect.Field; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; impo

  • Java程序开发中abstract 和 interface的区别详解

    先给大家说下基本概念 在Java语言中, abstract class 和interface 是支持抽象类定义的两种机制.正是由于这两种机制的存在,才赋予了Java强大的 面向对象能力.abstract class和interface之间在对于抽象类定义的支持方面具有很大的相似性,甚至可以相互替换,因此很多开发者在进 行抽象类定义时对于abstract class和interface的选择显得比较随意.其实,两者之间还是有很大的区别的,对于它们的选择甚至反映出对 于问题领域本质的理解.对于设计意

随机推荐