原创

Java面试题p7

温馨提示:
本文最后更新于 2025年06月30日,已超过 347 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我

MyBatis执行器(Executor)

SimpleExecutor:每执行一次update或select就开启一个Statement对象,用完立刻关闭Statement对象

ReuseExecutor:执行update或select,以SQL作为key查找Statement对象,存在就使用,不存在就创建,用完后不关闭Statement对象,而是放置在Map内供下次使用。(重复使用Statement对象)

BatchExecutor:执行update(jdbc批处理不支持select),将所有SQL都添加到批处理中(addBatch()),等待统一执行(executeBatch)。它缓存了多个Statement对象,每个Statement对象都是addBatch()完毕后,等待逐一执行executeBatch()批处理,与jdbc处理相同

MyBatis分页插件的实现原理

分页插件的基本原理:使用MyBatis提供的插件接口,实现自定义插件,在插件的拦截方法内拦截执行的SQL,然后重写SQL,根据dialect方言,添加对应的物理分页语句和物理分页参数

RabbitMQ使用场景

  • 抢购活动、削峰填谷、防止系统崩塌
  • 延迟信息处理,比如下单10分钟之后未付款的用户发送邮件提醒
  • 解耦系统:对于新增的功能可以单独写模块扩展。比如用户确定评价之后,新增了给用户返积分的功能。这个时候不用在代码里添加新增积分的功能,只需要把新增积分的接口订阅评价的消息队列即可,后面添加任何功能只需要订阅对应的消息队列即可

RabbitMQ重要的角色

生产者:消息的创建者,负责创建和推送数据到消息服务器

消费者:消息的接收方,用于处理数据和确认消息

代理:RabbitMQ本身。扮演“快递”的角色

RabbitMQ重要组件

ConnectionFactory(连接管理器):应用程序与Rabbit之间建立连接的管理器。程序代码中使用

Channel(信道):消息推送使用的通道

Exchange(交换机):用于接收、分配消息

Queue(队列):用于存储生产者的消息

RoutingKey(路由键):用于把生产者的数据分配到交换机上

BindingKey(绑定键):用于把交换器的消息绑定到队列上

Rabbit中vhost的作用

vhost:每个Rabbit都能创建很多vhost,称为虚拟主机。每个虚拟主机其实都是mini版的RabbitMQ,它拥有自己的队列,交换机和绑定,拥有自己的权限机制

RabbitMQ发送消息

首先客户端必须连接到RabbitMQ服务器才能发布和消费消息。客户端和rabbit server之间会建立一个tcp连接,一旦tcp

打开并通过了 认证(认证就是你发送给rabbit服务器的用户名和密码),你的客户端和RabbitMQ就创建了一条amqp信道(channel),信道是创建在真实tcp上的虚拟连接,amqp命令都是通过信道发送出去的,每个信道都会有一个唯一的id,不论是发布消息、订阅队列都是通过这个信道完成的

RabbitMQ保证消息的稳定性

  1. 提供了事务功能
  2. 通过将channel设置为confirm(确认)模式

RabbitMQ避免消息丢失

消息持久化到磁盘,保证服务器重启消息不丢失

每个集群中至少有一个物理磁盘,保证消息写入磁盘

RabbitMQ消息持久化缺点

降低服务器的吞吐量。尽量使用ssd硬盘来缓解吞吐量问题

RabbitMQ广播类型

direct(默认方式):最基础最简单的模式。发送方把消息发送给订阅方。多个订阅者,默认使用轮询方式发送消息

headers:与direct类似,性能差

fanout:分发模式,把消息分发给所有订阅者

topic:匹配订阅模式,使用正则匹配到消息队列,能匹配到的都能接收消息

RabbitMQ实现延迟消息队列

  1. 通过消息过期后进入死信交换机,再由交换机转发到延迟消息队列,实现延迟功能
  2. 使用RabbitMQ-delayed-message-exchange 插件实现延迟功能

RabbitMQ集群作用

高可用:某个服务器出现问题,整个RabbitMQ还可以继续使用

高容量:集群可以承载更多的消息量

数据库三范式

第一范式:列的原子性,即数据库表的每一列都是不可分割的原子数据项

第二范式:要求实体的属性完全依赖于主关键字。

完全依赖:不能存在仅依赖主关键字一部分的属性

第三范式:任何非主属性不依赖于其他非主属性

自增表共7条数据,删除最后2条,重启Mysql数据库,插入一条数据,此时id是多少

表类型:

MyISAM:id为8

InnoDB:id为6

InnoDB会把自增主键的最大id记录在内存中,所以重启会导致最大id丢失

数据库版本

select version() ;

 数据库事务--->ACID:

Atomicity(原子性):一个事务(transaction)中的所有操作,或者全部完成,或者全部不完成。不会结束在中间环节。事务在执行过程中发生错误,会被恢复(Rollback)到事务前的状态,就像这个事务从来没有执行过一样。即,事务不可分割,不可约简

Consistency(一致性):在事务开始之前和事务结束之后。数据库的完整性没被破坏。这表示写入的资料必须完全符合所有的预设约束、触发器、级联回滚等

Isolation(隔离性):数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性以防止多个事务并发执行时由于交叉执行而导致数据的不一致 。事务隔离分为不同级别,包括 读未提交(Read uncommited)、读提交(read commited)、可重复读(repeatable read)、串行化(Serializable)

Durability(持久性):事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失

char和varchar区别

char(n):固定长度类型

优点:效率高

缺点:占用空间

场景:存储密码的md5值,适用于固定长度

varchar(n):可变长度。存储的是每个值占用的字节再加上一个用来记录其长度的字节的长度

空间上考虑:varchar

效率上考虑:char

float和double区别

float:最大存8位的十进制数。内存中占4字节

double:最多存储16位的十进制数。内存中占8字节

Mysql的左连接、右连接、内连接

内连接关键字:inner join;把匹配的关联数据显示出来

左连接:left join;左边的表全部显示出来,右边的表显示出符合条件的数据

右连接:right join;右边的表全部显示出来,左边的表显示符合条件的数据

Mysql索引实现

索引:满足某种特定查找算法的数据结构,而这种数据结构会以某种方式指向数据,从而实现高效查找数据

不同的数据引擎实现不同:主流的数据库引擎都是B+树实现的,B+树的搜索效率,可以达到二分法的性能,找到数据之后就找到了完整的数据结构了,所以引擎的性能也是更好的

Mysql索引是否满足需求

使用explain查看SQL是如何执行语句的,从而分析索引是否满足需求。

语法:

explain select * from table where type=1
正文到此结束