MyBatis结合多线程实现模拟缓存

原创 2018年04月17日 17:00:26

模拟多线程实现一级缓存

设置两个线程,均用于实现查询功能,一级缓存默认打开,不打开二级缓存

package test;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.apache.ibatis.session.SqlSessionManager;

import mapper.AuthorMapper;
import po.Author;

/**
 * 结合多线程实现模拟一级缓存
 * 设置了两个线程,两个线程均用于查询,查询的是不同的内容
 * @author baka
 */
public class test1{
	private static SqlSession session;

	public static SqlSession getSqlSessionTest() {
		if (session == null) {
			String resource = "SqlMapperConfig.xml";
			InputStream iStream = test1.class.getClassLoader().getResourceAsStream(resource);
			SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(iStream);
			session = factory.openSession();
		}
		return session;
	}

	//从线程
	static class Run implements Runnable{
		@Override
		public void run() {
			try {
				//获取到操作author表的映射类
				AuthorMapper authorMapper = getSqlSessionTest().getMapper(AuthorMapper.class);  
				Author author = authorMapper.selectByPrimaryKey(1);
				System.out.println("-----------------------------------------------");
				System.out.println("从线程:" + author.toString());
				Thread.sleep(10);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}

	//主线程
	public static void main(String[] args) throws InterruptedException {
		Run run = new Run();
		for (int i = 0; i < 10; i++) {
			Thread thread = new Thread(run);
			//获取到操作author表的映射类
			AuthorMapper authorMapper = getSqlSessionTest().getMapper(AuthorMapper.class);  
			Author author1 = new Author(1, "baka", i+"123", null, null);
			authorMapper.updateByPrimaryKey(author1);
			session.commit();
			Author author = authorMapper.selectByPrimaryKey(2);
			System.out.println("-----------------------------------------------");
			System.out.println("主线程:" + author.toString());
			thread.sleep(10);
			thread.start();
		}
	}
}

模拟多线程实现二级缓存

设置两个线程,均用于实现查询功能,打开二级缓存

注意,查询之后一定要将一级缓存刷入至二级缓存,不然命中率将为0

package test;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.apache.ibatis.session.SqlSessionManager;

import mapper.AuthorMapper;
import po.Author;

/**
 * 结合多线程实现模拟二级缓存,设置了两个线程,
 * 两个线程均用于查询
 * @author baka
 */
public class test2 {
	private static String resource = "SqlMapperConfig.xml";
	private static InputStream iStream = test1.class.getClassLoader().getResourceAsStream(resource);
	private static SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(iStream);

	// 从线程
	static class Run implements Runnable {
		@Override
		public void run() {
			try {
				SqlSession session = factory.openSession();
				AuthorMapper authorMapper = session.getMapper(AuthorMapper.class);
				Author author = authorMapper.selectByPrimaryKey(1);
				session.close();  //一级缓存刷入二级缓存
				System.out.println("从线程:" + author.toString());
				Thread.sleep(10);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println("--------------------------------------");
		}
	}

	// 主线程
	public static void main(String[] args) throws InterruptedException {
		Run run = new Run();
		for (int i = 0; i < 10; i++) {
			Thread thread = new Thread(run);
			SqlSession session = factory.openSession();
			AuthorMapper authorMapper = session.getMapper(AuthorMapper.class);
			Author author = authorMapper.selectByPrimaryKey(2);
			session.close();   //一级缓存刷入二级缓存
			System.out.println("主线程:" + author.toString());
			thread.sleep(10);
			thread.start();
			System.out.println("--------------------------------------");
		}
	}
}

版权声明:本文为博主原创文章,允许转载,转载时请说明出处 https://blog.csdn.net/qq_41541619/article/details/79977340

spring+mybatis+ehcache配置缓存

1:spring加载ehcache配置文件
  • u013628152
  • u013628152
  • 2016-05-18 11:29:26
  • 5034

java 使用线程模拟 队列实现

package com.bjsxt.base.conn009; import java.util.LinkedList; import java.util.concurrent.TimeUnit; ...
  • u014535678
  • u014535678
  • 2017-03-06 17:13:20
  • 409

spring springmvc mybatis shiro 以及 ehcache(配合shiro实现缓存验证 配合spring实现二级缓存)

  • 2016年12月14日 23:10
  • 36.7MB
  • 下载

《深入理解mybatis原理》 MyBatis缓存机制的设计与实现

本文主要讲解MyBatis非常棒的缓存机制的设计原理,给读者们介绍一下MyBatis的缓存机制的轮廓,然后会分别针对缓存机制中的方方面面展开讨论。...
  • u010349169
  • u010349169
  • 2014-11-23 13:57:29
  • 40704

redis整合spring mybatis --缓存方案

上一篇总结了redis sentinel(哨兵方案)的配置流程,本篇就redis整合ssm框架进行说明。目前,大多数公司用redis主要做缓存用,对于那些不常变动的数据来说,我们将其缓存在redis中...
  • donggang1992
  • donggang1992
  • 2016-04-05 15:12:53
  • 19731

Redis+MyBatis自定义注解实现缓存

在数据库查询前我想查询是否存在缓存,不存在则查询,这样的重复性操作写在代码里很难看,通过AspectJ的AOP编程,可以很优雅地实现这个缓存过程。 但是在使用过程中,发现Spring自带的@Cach...
  • cx118118
  • cx118118
  • 2017-09-20 16:59:50
  • 521

用例子介绍mybatis的缓存机制

在实际的项目开发中,通常对数据库的查询性能要求很高,而mybatis提供了查询缓存来缓存数据,从而达到提高查询性能的要求。 mybatis的查询缓存分为一级缓存和二级缓存,一级缓存是SqlSessio...
  • zouxucong
  • zouxucong
  • 2017-04-01 18:51:22
  • 4404

spring+mybatis 多线程访问数据

在做大数据量查询的时候,想到了用多线程,各线程之间没有联系,各走各的业务逻辑,节省了很多时间 ThreadPoolExecutor executor = new ThreadPoolExec...
  • lexuansweet
  • lexuansweet
  • 2017-05-17 11:43:15
  • 594

深入理解mybatis原理(五) MyBatis缓存机制的设计与实现

本文主要讲解MyBatis非常棒的缓存机制的设计原理,给读者们介绍一下MyBatis的缓存机制的轮廓,然后会分别针对缓存机制中的方方面面展开讨论。 MyBatis将数据缓存设计成两级结构,分...
  • z742182637
  • z742182637
  • 2017-05-20 10:07:40
  • 776

mybatis缓存 redis实现

最近项目需要针对mybatis查询加入缓存,使用redis,于是上网查找mybatis缓存 redis实现的相关文章,有很多关于mybatis redis缓存的介绍以及mybatis Cache接...
  • win7system
  • win7system
  • 2016-04-13 11:13:41
  • 2094
收藏助手
不良信息举报
您举报文章:MyBatis结合多线程实现模拟缓存
举报原因:
原因补充:

(最多只允许输入30个字)