八股文学习

78 阅读3分钟

框架篇

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:true

mybatis-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接口,实现自定义的拒绝策略 线程池运行原理图:

图片1.png