![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
mybatis探究
猿码YM
这个作者很懒,什么都没留下…
展开
-
mybatis缓存LruCache源码分析
LruCacheLruCache是如何实现的linkedHashMap源码分析双向链表链表优点链表缺点双向链表节点移动节点到链表的尾部为什么要散列表和链表搭配使用LruCache是如何实现的LruCache的关键代码:public class LruCache implements Cache { private final Cache delegate; private Map<Object, Object> keyMap; private Object eldestKey原创 2021-12-04 23:55:13 · 588 阅读 · 0 评论 -
mybatis自定义插件开发
现在有这样一个需求:需要自定义mybatis插件判断当前sql执行时间时候超过自定义的值,如果超时就打印相应的日志插件自定义代码:github代码地址@Intercepts( { @Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class}), @Signature(type = Ex原创 2021-12-02 23:52:35 · 263 阅读 · 0 评论 -
mybatis打印JDBC日志源码分析(JDK动态代理)
mybatis支持不同的数据库,具体访问数据库是由不同的数据库厂商提供的驱动jar包。比如:mysql的mysql-connector-java.jar不同厂商提供的提供的jar也是基于JDK下的java.sql包中的接口去实现的比如:不同的数据库厂商基于Connection接口实现了自家的Connection访问数据库类不同厂商只要基于JDK提供的接口实现类,就能访问数据库此处不得不赞美面向接口编程的精妙之处mybatis框架的作用是把数据库的元数据转成java对象,方便java代码操作,具体原创 2021-11-30 15:30:29 · 408 阅读 · 0 评论 -
mybatis阻塞缓存BlockingCache源码分析
在分析之前我们先学习一个知识点CountDownLatch的使用public static void main(String[] args) throws InterruptedException { CountDownLatch countDownLatch = new CountDownLatch(2); System.out.println("main start"); new Thread(() -> { try { Syst.原创 2021-11-29 19:07:46 · 320 阅读 · 0 评论 -
mybatis阻塞缓存BlockingCache使用
这篇文章其实可以算是,mybatis缓存被击穿的复现和解决办法测试代码如下:github代码地址@Test void test() throws InterruptedException { for (int i = 0; i < 5; i++) { new Thread(() -> { try (SqlSession sqlSession = sqlSessionFactory.openSession()) { Assert原创 2021-11-29 18:00:48 · 759 阅读 · 0 评论 -
mysql事务隔离级别——读已提交
事务数据脏读复现事务A事务B开启事务,设置事务隔离级别为读未提交查到5条记录开启事务,插入一条记录id=6 ,事务并未提交继续查询,查到6条记录事务回滚继续查询,查到5条记录这样在事务A中就出现了脏读数据事务脏读解决:设置事务隔离为读已提交事务A事务B开启事务,设置事务隔离级别为读已提交查到5条记录开启事务,插入一条记录id=6 ,事务并未提交继续查询,依然查到5条记录事.原创 2021-11-24 01:39:20 · 1422 阅读 · 0 评论 -
mysql事务隔离级别——可重复读
不可重复读取问题复现:设置事务隔离级别为读取已提交|事务A事务B开启事务,设置事务隔离级别为读取已提交查到5条记录开启事务,插入一条记录id=6事务提交继续查询,依然查到6条记录这就出现了一个问题,同一个事务中两次读取的事务条数不一致更改事务隔离级别解决这个问题设置事务隔离级别为可重复读取事务A事务B开启事务,设置事务隔离级别为可以重复读取查到五条记录开启事务,插入一条记录id=6事务.原创 2021-11-24 00:16:34 · 1768 阅读 · 0 评论 -
mysql事务隔离级别——序列化
借助mybatis来测试和理解mysql事务特性一次session操作对应一次事务操作序列化的意思就是本次事务序列化执行完毕之后,才允许其他事务的执行生效,如果这个期间其他事务也修改了相同的记录,那么以当前的事务修改为准。为什么要序列化,因为会出现幻读错误复现幻读流程:事务A事务B开启事务,设置事务隔离级别为可以重复读取查到五条记录开启事务,插入一条记录id=6事务提交继续查询,依然查到五条记录插入一条记录id=6事务提交.原创 2021-11-23 23:03:25 · 712 阅读 · 0 评论 -
mybatis一级缓存和二级缓存彻底关闭
在mybatis-coinfig.xml文件添加如下配置:<configuration> <settings> <!-- 关闭二级缓存--> <setting name="cacheEnabled" value="false"/> <!-- 设置一级缓存的作用范围是一条sql语句执行期间,执行完毕清空一级缓存--> <setting name="原创 2021-11-23 00:44:30 · 3034 阅读 · 0 评论 -
mybatis一级缓存和二级缓存数据脏读问题
Talk is cheap, Show me the code.void test() { /** * 一级缓存的作用范围session */ try (SqlSession session = sqlSessionFactory.openSession()) { User user = new User(); user.setId(6); user.setName("test6"); int i = session.in原创 2021-11-23 00:30:47 · 2428 阅读 · 0 评论 -
mybatis二级缓存实现原理——装饰器模式
装饰器模式类图cache接口这就是装饰器和被装饰器需要实现的接口,这也体现了面向接口编程的精妙之处。public interface Cache { String getId(); void putObject(Object key, Object value); Object getObject(Object key); Object removeObject(Object key); void clear(); int getSize(); default R.原创 2021-11-22 20:30:32 · 336 阅读 · 0 评论 -
如何使用mybatis缓存
1 一级缓存一级缓存默认是开启的2 二级缓存开启二级缓存需要设置两个地方settings设置设置mybatis-config.xml参数<configuration> <settings> <!-- cacheEnabled默认为true --> <setting name="cacheEnabled" value="true"/> </settings>原创 2021-11-22 16:40:48 · 272 阅读 · 0 评论 -
正确使用mybatis游标
使用mybatis游标的目的是,避免加载很多数据到jvm,造成内存溢出但是初次使用游标不一定能够正确使用下面就给出两种不同的方式,对比一下1.错误使用方式设置堆内存最大值,方便观察jvm内存使用情况代码如下:mapper.java @Select("SELECT * FROM user_detail") Cursor<UserDetail> getFakeCursor();Test.java @Test public void getFakeCursor原创 2021-11-15 21:35:25 · 6382 阅读 · 0 评论