框架篇
mybatis
分页
mybatis的分页是如何实现的
分页分为两种:
- 逻辑分页:将所有数据查询出来,再在内存中进行分页处理;
- 物理分页:直接在数据库中进行分页;
具体实现:
1、自己写SQL进行分页;(物理分页)
2、使用拦截器进行分页;(物理分页)
3、使用PageHelper进行分页;(物理分页)
4、使用RowBounds进行分页;(逻辑分页)
缓存
MyBatis框架里面的缓存机制是怎么回事?
MyBatis中有两级缓存:
一级缓存和二级缓存
一级缓存
一级缓存是SqlSession级别的缓存,通过同一个SqlSession查询的数据会被缓存,下次查询相同的数据,会从一级缓存中直接读取,不会再从数据库查询
一级缓存默认是开启的,是无法关闭的,但可以调用SqlSession的clearCache()方法清除当前SqlSession的一级缓存,不同的SqlSession之间的缓存数据是隔离的
注意:
同一个SQLSESSION查询中间执行了增删改操作会使得缓存失效
xml配置
<settings>
<setting name="localCacheScope" value="SESSION"/>
<!--<setting name="localCacheScope" value="STATEMENT"/>-->
</settings>
默认开启是SESSION
| 属性值 | 含义 |
|---|---|
| SESSION | 一级缓存在一个会话中生效。即在一个会话中的所有查询语句,均会共享同一份一级缓存,不同会话中的一级缓存不共享。 |
| STATEMENT | 一级缓存仅针对当前执行的SQL语句生效。当前执行的SQL语句执行完毕后,对应的一级缓存会被清空。 |
二级缓存
二级缓存是跨SqlSession的,多个SqlSession可以共用同一个二级缓存;
二级缓存是mapper级别的缓存,根据mapper的namespace区分,两个mapper的namespace相同,则这两个>mapper执行sql查询到的数据将缓存到相同的二级缓存区域中;
使用二级缓存的POJO类要实现Serializable接口;
二级缓存默认是关闭的,开启二级缓存需要如下任意一配置即可
yaml开启
# 开启缓存 mybatis: configuration: cache-enabled:truemybatis-config.xml开启
<setting name="cacheEnabled" value="true" />
Redis
缓存过期策略
内存淘汰机制
redis 内存淘汰机制有以下几个:
• noeviction: 当内存不足以容纳新写入数据时,新写入操作会报错
• allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的 key(这个是最常用的)。
• allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个 key。
• volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的 key(这个一般不太合适)。
• volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个 key。
• volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的 key 优先移除。
JAVA基础
线程池
线程池内置的拒绝策略:
1.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常,这是默认的拒绝策略;
2.DiscardPolicy:直接丢弃任务,不抛出异常,没有任何提示;
3.DiscardOldestPolicy:丢弃任务队列中靠最前的任务,当前提交的任务不会丢弃;
4.CallerRunsPolicy: 交由任务的调用线程(提交任务的线程)来执行当前任务;
以上的四种内置拒绝策略,还可以通过实现RejectedExecutionHandler接口,实现自定义的拒绝策略 线程池运行原理图: