Memcache学习笔记二:Memcache做Mybatis的缓存

MyBatis 一级缓存在分布式下的坑你知道吗? 前言: 最近生产环境的余额系统在扣减余额时经常出现余额够但是提示余额不足无法扣减的情况。查看代码逻辑,发现会先查询一次判断余额是否够,再实际扣减,之后查看日志发现并没有执行查询语句就返回错误了,推测可能是 MyBatis 一级缓存没有关闭引起的脏数据问题。关闭一级缓存后果然恢复正常了。 所以有了这篇文章,验证下 MyBatis 一级缓存的生效条件。 一级缓存 MyBatis 默认会开启一级缓存,在... 阅读详情

Memcache学习笔记二:Memcache做Mybatis的缓存

标签(空格分隔): Memcache Mybatis


一、简介

    使用Memcache做Mybatis的缓存,Mybatis给我们提供了<cache>标签用于配置缓存。我们可以通过修改Mybatis的cache接口的实现类进行扩展自己的缓存。Memcache为我们做好了扩展,我们使用官方的jar即可进行缓存的替换。

二、导入相关jar包

    mybatis-memcached-1.0.0.jar     //Memcache和Mybatis整合jar
    spymemcached-2.10.6.jar         //Memcache连接jar

    Spring的相关jar、Mybatis相关jar、Mysql相关jar、log4j相关jar     //省略,不一一列举

三、简单示例

    场景分析:
        一个用户表和订单表,一个用户对应多个订单。

        通过查询用户,同时查询出用户对应的订单。两种实现方式:通过表连接和子查询,在这里使用子查询方式。

        对用户进行设置缓存<cache>,因为订单表示通过用户表的子查询查询的,Mybatis的机制会将订单表的查询数据同时进行缓存。对查询数据进行了缓存,如果对订单表的进行其他操作,如修改、删除、添加。就不能对通过用户表查询出来的订单数据缓存进行删除。这样就会导致一种情况数据能及时进行更新。
        Mybatis的缓存机制是对命名空间的独自管理。所以,我们应该采取另外一个标签<cache-ref>。
        需要注意:
            ①:在子查询的时候,Select标签需要使用因为查询在不同的Mapper文件中需要写全限定名。            
            ②:用户的Mapper文件中的<cache>标签的type可以有两种:MemcachedCache和LoggingMemcachedCache,前者没有日志功能,后者具有日志功能。【详细介绍参考Memcached官方文档】
        具体配置如下:
  1. IUserDAO的Mapper文件

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
    <mapper namespace="com.motui.dao.IUserDAO">
        <cache type="org.mybatis.caches.memcached.LoggingMemcachedCache" />
        <!-- 定义mapper -->
        <resultMap type="User" id="UserMapper">
            <id column="id" property="id"/>
            <result column="name" property="name"/>
            <!-- 关系属性 -->
            <collection property="orders" ofType="Order" column="id" select="com.motui.dao.IOrderDAO.queryOrderByUserId"/>
        </resultMap>
        <!-- 查询语句 -->
        <select id="queryAll" resultMap="UserMapper" >
            select id,name from t_user
        </select>
    </mapper>
  2. IOrderDAO的Mapper文件

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
    <mapper namespace="com.motui.dao.IOrderDAO">
        <cache-ref namespace="com.motui.dao.IUserDAO"/>
        <!-- 定义mapper -->
        <resultMap type="Order" id="OrderMapper">
            <id column="id" property="id"/>
            <result column="name" property="name"/>
        </resultMap>
        <!-- 查询语句 -->
        <select id="queryOrderByUserId" resultMap="OrderMapper" parameterType="int" >
            select id,name from t_order where user_id=#{id}
        </select>
    </mapper>
  3. memcache.properties配置文件
    将该配置文件放到classPath下,如果没有改配置文件,默认使用默认设置,如下图的图表中的配置
    官方文档截图:

    这里写图片描述

    //配置Memcache服务器
    org.mybatis.caches.memcached.servers=192.168.0.167:11211 192.168.0.167:11212
    //缓存过期时长
    org.mybatis.caches.memcached.expiration=300
    //其他配置参见默认配置

    四、总结

        Memcache做Mybatis的缓存需要了解Mybatis的缓存特点和配置。还有就是对Memcache的使用和集群的搭建的使用。详细的配置可参看Mybatis的官方文档和Memcache的官方文档。都有详细的介绍和配置的示例。
    

【源码链接】

Spring4+SpringMVC+mysql+memcached【同时支持mybatis+hibernate两种底层操作框架】 项目使用Spring4+SpringMVC+mysql【同时支持mybatis+hibernate两种底层操作框架】+memcached 立即下载

相关推荐

ROS2+PYTHON VENV虚拟环境配置方法

ROS2+PYTHON VENV配置方法本篇针对的是python。

下雨夏云的博客 555

memcached缓存与mybatis的整合

1.添加依赖 <dependency> <groupId>org.mybatis.caches</groupId> <artifactId>mybatis-memcached</artifactId> ...

weixin_30467087的博客 211

人工智能顶会投稿指南:CCF-A类会议ACL、ICML、NeurIPS、ICLR的投稿周期与影响力解析

本文详细解析了CCF-A类会议ACL、ICML、NeurIPS、ICLR的投稿周期与影响力,涵盖各会议的投稿时间线、评审特点及录用率。ACL注重自然语言处理,ICML强调机器学习理论,NeurIPS覆盖神经信息处理,ICLR聚焦表征学习。文章还提供了实战投稿策略,帮助研究者提升投稿成功率。

weixin_29211309的博客 3343

MyBatis的集成与Memcache

1.背景介绍 MyBatis是一款高性能的Java数据库访问框架,它可以使用简单的XML或注解来配置和映射现有的数据库操作。Memcached是一种高性能的分布式缓存系统,它可以用来缓存数据和对象,以提高应用程序的性能。在这篇文章中,我们将讨论如何将MyBatis与Memcached集成,以及这种集成的优势和挑战。 1.背景介绍 MyBatis是一款Java数据库访问框架,它可以使用简单的X...

AI天才研究院 914

建议收藏:华为海思IC设计笔试题,含解析(附下载)

接触过的部门有麒麟芯片、CPU/GPU,总体面试感觉非常好,规范且认真,第一轮手撕代码状态机+复盘机考题+瞄准几个知识点深挖,时间1hour+;一二轮面试是连着的,所以很累。但是岗位就那么多,在面试的时候,很多同学因为准备不充分,与岗位失之交臂,无缘进入该公司。时序电路有记忆功能,不会产生锁存器,锁存器一般在组合逻辑中case写不全,else写不全,或者敏感列表写不全。

nuoweishizi的博客 3288

Springboot + vue 实现导出word

Springboot + vue 实现导出word 后端代码 使用word先创建好已知的模板 使用word工具另存为.xml格式的文件 使用freemarker ftl模板 将修改后的xml文件复制到开发工具中,将文件后缀修改为ftl文件,并且将里面的动态值使用${}包裹例如:${zyjn} word工具类 /*** * * Project Name:maventest * <p>生成word工具类<br> * * @ClassName: WordUtil *

qq_45542373的博客 2895

spring+Mybatis+ memcached简单示例

spring、Mybatis、memcached是什么,干什么的我这里就不介绍l

fangguozi的专栏 3199

C++面向对象程序设计大作业:魔兽世界(三):开战

C++面向对象程序设计大作业:魔兽世界(三):开战问题描述问题分析代码 问题描述 问题来自于北京大学郭炜老师的C++慕课的大作业 魔兽世界的西面是红魔军的司令部,东面是蓝魔军的司令部。两个司令部之间是依次排列的若干城市,城市从西向东依次编号为1,2,3 … N ( N <= 20)。红魔军的司令部算作编号为0的城市,蓝魔军的司令部算作编号为N+1的城市。司令部有生命元,用于制造武士。 两军的司令部都会制造武士。武士一共有dragon 、ninja、iceman、lion、wolf 五种。每种武士都有

RedRum_1965的博客 4036

mybatis用memcache做二级缓存

参考自http://www.mybatis.org/memcached-cache/ 1.添加依赖<dependency> <groupId>org.mybatis.caches</groupId> <artifactId>mybatis-memcached</artifactId> <version&...

ailuannian3778的博客 248

axi ps读写pl_PL读写DDR:Datamover能干什么

最近发现工程项目中一直在用AXI-DMA。这玩意儿搬数据倒是没问题,就是用axi-lite配置起来非常反人类。。。简单的办法其实是用datamover ip核。这个ip核能干嘛呢。准备写个文章解析一下。由于好多feature没用过,所以仅仅看文档可能理解有误,欢迎指出错误。首先扫个盲:MM2S指的是Memory map to stream. 读DDR. S2MM指的是steam to memory...

weixin_35908791的博客 1597

103.在 Vue 3 中使用 OpenLayers 控制图层来显示/隐藏地图

是一个强大的开源库,可以用于构建各种地理信息系统应用。在 Vue 3 中,我们可以结合。方法,可以直接控制某个图层是否可见,而不需要删除或重新创建图层。在开始之前,确保你已经搭建了 Vue 3 项目,并安装了。本文将详细介绍如何在 Vue 3 组合式 API (,并实现按钮控制地图的显示/隐藏功能。会导致 OSM 瓦片地图无法加载。方法控制地图图层的显示与隐藏。安装完成后,即可开始编写代码。在本教程中,我们介绍了如何在。来实现地图的显示/隐藏功能。来实现交互式地图,并通过。在 WebGIS 开发中,

小彭的博客 1560

自定义mybatis的拦截器+Memcached+treeNMS

一.自定义mybatis拦截器 第一步:实现Interceptor接口 public interface Interceptor { //拦截之后需要执行的方法 Object intercept(Invocation invocation) throws Throwable; //返回代理对象 Object plugin(Object target); //设置拦截器 运行的一些参数 void setProperties(Properties properties); } package com.or

Pig-pig-pig的博客 262

COMSOL介电弹性体数值仿真指南:预拉伸圆形DEA的稳态变形分析(I)

本期博客是《COMSOL介电弹性体数值仿真指南》系列博客中的一期。聚焦于介电弹性体驱动器(DEA)中最为经典的预拉伸圆形DEA驱动器构型,对其物理特性及数值仿真总体方案进行介绍与讨论。

忘了面孔的Batou 453

Redis 、Memcache和Mybatis的一级缓存、二级缓存 简述

1、Redis和Memcache都是将数据存放在内存中,都是内存数据库。不过memcache还可用于缓存其他东西,例如图片、视频等等; 2、Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,hash等数据结构的存储; 3、虚拟内存--Redis当物理内存用完时,可以将一些很久没用到的value 交换到磁盘; 4、过期策略--memcache在set时就指定,例如set ...

rlk512974883的博客 8715

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Mybatis08-缓存

java中常见的缓存技术、mybatis的一级缓存、mybatis的二级缓存,mybatis集成第三方缓存机制

qq_31532983的博客 1184

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

【干翻Mybatis源码系列】Mybatis缓存方案第一篇 之 Mybatis缓存方案概述

干翻Mybatis系列文章第不知道几篇,我们立志研究明白Mybatis

七叔的博客 1万+

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

MyBatis 一级缓存在分布式下的坑

MyBatis 的一级缓存在单机环境下可以减少与 MySql 的交互,提高性能,但是在分布式环境下容易产生脏数据。建议在生产环境下关闭,使用 Redis,Memcache 等代替。...

GitChat 2990

MyBatis缓存机制

计算机中内存和硬盘都是用来存储数据的,一个是临时存储,一个是持久化存储。

qq_45186811的博客 1457

mybatis查询缓存

查询缓存 为什么要缓存 如果缓存(内存)中有数据,就不需要从数据库中去查询了,而是直接从内存中拿,大大提供系统性能。 查询商品ID为1000的商品 第一次查询时候,去数据库拿,写到内存中、并且返回 第2、3次,直接内存读,然后返回 什么是查询缓存 Mybatis提供查询,用于减轻数据库的压力,提供数据库的性能。 Mybatis提供...

simple_start的博客 353

MyBatis的缓存机制介绍

MyBatis 缓存包括:一级缓存:将查询到的数据存储到 SqlSession 中二级缓存:将查询到的数据存储到 SqlSessionFactory 中或者是集成其它第三方的缓存:比如 EhCache(Java语言开发的),Memcache(C语言开发的)等。注意:缓存只针对于 DQL(查询)语句,也就是说缓存机制只对应 Select 语句。一级缓存默认是开启的一级缓存失效情况包括两种:第一种:第一次查询和第二次查询之间,手动清空了一级缓存。

王二的博客 1332

mybatis的一级缓存和二级缓存

面试题 说一下mybatis的一级缓存和二级缓存? Mybatis的一级缓存是默认开启的,它只相对于同一个SqlSession有效,所以也称之为SqlSession缓存。当参数和SQL完全相同的情况下,使用同一个SqlSession对象调用同一个Mapper方法,当第1次执行SQL语句后,MyBatis会自动将其放在缓存中,后续再次查询时,如果没有声明需要刷新,且缓存没有超时,会直接取出此前缓存的数据,而不会再次发送SQL到数据库。 Mybatis的二级缓存是默认未开启的,如果希望开启......

Theshy08的博客 2156

mysql redis缓存层_如何用redis/memcache做Mysql缓存层

方法一:直接用MysqlMysql有缓存,实现了类似的功能,如果需要缓存的东西很多,可以把缓存的内存设置大一点。这样的好处就是不用去控制缓存的失效,确保数据一致性。方法二:启用用DAO框架的缓存比如Mybatis、Hibernate都是可以直接开启二级缓存,一般是用ehcache作为实现,只要配置一下就行,无需额外操作。方法三:自行实现用AOP去在Dao层做一个切面,把调用的“类名+方法名+参数”...

weixin_36203080的博客 197

【MyBatis框架】MyBatis提供的缓存机制

MyBatis提供的缓存机制 缓存就是数据交换的缓冲区(称作:Cache),当某一硬件要读取数据时,会首先从缓存汇总查询数据,有则直接执行,不存在时从内存中获取。由于缓存的数据比内存快的多,所以缓存的作用就是帮助硬件更快的运行。缓存提供了一种存储方式,主要是用于存储数据,当客户端访问数据时可以直接访问缓存,从而减轻数据库的压力,提高数据库的性能。 数据的访问流程: 其中服务器主要的功能是和数据库进行数据交互,其主要操作无非是增删改查(查询操作比较多,特点是:频率高,不会改变数据),查询操作时服务器会从数据

Sampson_S的博客 373

mybatis缓存

一、 一级缓存(Local Cache)1.1 概念作用域:SqlSession 级别(默认开启,不能关闭)。原理:一次查询结果会放到当前 SqlSession 的 HashMap 中,后续相同 SQL(相同参数、相同 StatementId)会直接从缓存取,而不会再查数据库。失效场景:SqlSession 关闭。SqlSession 执行了 INSERT、UPDATE、DELETE 操作(缓存会清空)。查询参数不同或 SQL 不同。手动调用 clearCache()。

xiatianit的博客 119

Mybatis,禁用、清理二级缓存、以及整合Ehcache二级缓存

加上cache是默认所有select标签都开启二级缓存,加上useCache=“false”可以禁用。

哈哈 2234

MyBatis与Memcache集成后缓存数据不一致问题

缓存数据生成到memcache的过程如下:一、查询数据:1、根据执行的sql语句转换为缓存的sqlKey值2、根据sqlKey值查询memcache的缓存数据3、如果查询到缓存数据返回缓存数据4、如果查询不到缓存数据则执行sql查询5、根据执行的sql语句转换为缓存的sqlKey值6、根据 mapper namespace 生成 groupKey7、sql查询结果放入缓存,数据结构【sqlKey(...

weixin_30539625的博客 186
上一篇: Memcache学习笔记一:Memcache在Linux下的安装和使用
下一篇: Memcache学习笔记三:Memcache管理Tomcat的Session,Session共享
motui
博客等级 码龄10年 84粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值