模拟多线程实现一级缓存
设置两个线程,均用于实现查询功能,一级缓存默认打开,不打开二级缓存
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("--------------------------------------");
}
}
}