Java面试个人总结200多题(三)

声明:
这是个人面试的总结,很多都是我自己百度的,答案只供大家参考。

十二、Hibernate
113.为什么要使用 hibernate?
A。对jdbc访问数据库的代码进行了封装,简化数据访问层繁琐的重复性代码
B。简化dao层编码工作
C。性能非常好,是一个轻量级的框架

114.什么是 ORM 框架?
对象关系映射(ORM),即通过类与数据库表的映射关系,将对象持久化到数据库中

115.hibernate 中如何在控制台查看打印的 sql 语句?
true

116.hibernate 有几种查询方式?
本地SQL HQL QBC
117.hibernate 实体类可以被定义为 final 吗?
可以,最好不要用,将无法生成代理对象进行优化

118.在 hibernate 中使用 Integer 和 int 做映射有什么区别?
一个会返回0,一个返回null

119.hibernate 是如何工作的?
A。读取并解析配置文件
B。读取并解析映射文件,创建sessionFactory
C.打开session
D.创建事务
E。执行持久化操作
F。提交事务
G。关闭session
I。关闭sessionFactory

120.get()和 load()的区别?
get 返回的是实体类对象,load返回的是代理对象

121.说一下 hibernate 的缓存机制?
一级缓存是session缓存,二级缓存是sessionFactory缓存

122.hibernate 对象有哪些状态?
瞬时态,游离态,持久态

123.在 hibernate 中 getCurrentSession 和 openSession 的区别是什么?

  1. openSession 从字面上可以看得出来,是打开一个新的session对象,而且每次使用都是打开一个新的session,假如连续使用多次,则获得的session不是同一个对象,并且使用完需要调用close方法关闭session。
  2. getCurrentSession ,从字面上可以看得出来,是获取当前上下文一个session对象,当第一次使用此方法时,会自动产生一个session对象,并且连续使用多次时,得到的session都是同一个对象,这就是与openSession的区别之一,简单而言,getCurrentSession 就是:如果有已经使用的,用旧的,如果没有,建新的

124.hibernate 实体类必须要有无参构造函数吗?为什么?
是的,Hibernate框架会调用这个默认构造方法来构造实例对象

十三、Mybatis
125.mybatis 中 #{}和 ${}的区别是什么?
预编译处理,字符串替换

126.mybatis 有几种分页方式?
数组分页,SQL 的limit ,拦截器分页, rowbounds,

127.RowBounds 是一次性查询全部结果吗?为什么?
RowBounds 表面是在“所有”数据中检索数据,其实并非是一次性查询出所有数据,因为 MyBatis 是对 jdbc 的封装,在 jdbc 驱动中有一个 Fetch Size 的配置,它规定了每次最多从数据库查询多少条数据,假如你要查询更多数据,它会在你执行 next()的时候,去查询更多的数据。就好比你去自动取款机取 10000 元,但取款机每次最多能取 2500 元,所以你要取 4 次才能把钱取完。只是对于 jdbc 来说,当你调用 next()的时候会自动帮你完成查询工作。这样做的好处可以有效的防止内存溢出。

128.mybatis 逻辑分页和物理分页的区别是什么?
A。逻辑分页 逻辑分页利用游标分页,好处是所有数据库都统一,坏处就是效率低。
B。物理分页 物理分页就是数据库本身提供了分页方式,如MySQL的limit,oracle的rownum ,好处是效率高,不好的地方就是不同数据库有不同的搞法。

A.逻辑分页是一次性查询很多数据,然后再在结果中检索分页的数据。这样做弊端是需要消耗大量的内存、有内存溢出的风险、对数据库压力较大。
B.物理分页是从数据库查询指定条数的数据,弥补了一次性全部查出的所有数据的种种缺点,比如需要大量的内存,对数据库查询压力较大等问题。

129.mybatis 是否支持延迟加载?延迟加载的原理是什么?
支持,用lazylodingEnabled = ture;
原理:
使用CGLIB创建目标对象的代理对象,当调用目标方法时,进入拦截器方法,比如调用a.getB().getName(),拦截器invoke()方法发现a.getB()是null值,那么就会单独发送事先保存好的查询关联B对象的sql,把B查询上来,然后调用a.setB(b),于是a的对象b属性就有值了,接着完成a.getB().getName()方法的调用。这就是延迟加载的基本原理。

130.说一下 mybatis 的一级缓存和二级缓存?
一级缓存也叫sqlSession级别的缓存,二级缓存是mapper级别缓存

131.mybatis 和 hibernate 的区别有哪些?
1.1. 不同点

  1. hibernate对sql语句做了封装,使用HQL语句操作数据库。数据库无关性支持好,在项目需要支持多种数据库的情况下,代码开发量少,sql语句性能优化困难。
    mybatis使用sql语句操作数据库,不支持数据库无关性,在项目需要支持多种数据库的情况下,代码开发量相对较多。sql语句性能优化容易。
  2. hibernate配置java对象,与数据库表的对应关系,多表的关联关系查询配置复杂。mybatis配置java对象,与sql语句执行结果的对应关系,多表的关联关系查询配置简单。
  3. hibernate学习,使用门槛高,适合需求稳定的中小型项目,比如:办公自动化系统,财务系统。mybatis学习,使用门槛低,适合需求变化频繁,大型项目,比如:互联网项目。
  4. 在企业项目中,mybatis使用更多一些。

132.mybatis 有哪些执行器(Executor)?
SimpleExecutor:每执行一次update或select,就开启一个Statement对象,用完立刻关闭Statement对象。
ReuseExecutor:执行update或select,以sql作为key查找Statement对象,存在就使用,不存在就创建,用完后,不关闭Statement对象,而是放置于Map内,供下一次使用。简言之,就是重复使用Statement对象。
BatchExecutor:执行update(没有select,JDBC批处理不支持select),将所有sql都添加到批处理中(addBatch()),等待统一执行(executeBatch()),它缓存了多个Statement对象,每个Statement对象都是addBatch()完毕后,等待逐一执行executeBatch()批处理。与JDBC批处理相同。

133.mybatis 分页插件的实现原理是什么?
分页插件的基本原理是使用mybatis提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的sql,然后重新sql,根据dialect方言,添加对应的物理分页语句和物理分页参数;

134.mybatis 如何编写一个自定义插件?
十四、RabbitMQ
135.rabbitmq 的使用场景有哪些?
A。解耦 订单系统调用库存系统,如果库存系统挂了,导致订单失败。将订单写入消息队列,库存系统订阅消息队列;
B。异步 将不是必须的业务逻辑,进行异步处理
C。流量削峰 并发量大的时候,所有的请求怼到数据库,造成数据库连接异常,可以做秒杀和团购活动

136.rabbitmq 有哪些重要的角色?
生产者:消息的创建者,负责创建和推送数据到消息服务器
消费者:消息的接收方,用于处理数据和确认消息
代理:就是RabbitMQ本身,用于扮演快递的角色,本身并不生产消息

137.rabbitmq 有哪些重要的组件?
ConnectionFactory(连接管理器):应用程序与RabbitMQ之间建立连接的管理器
Channel(信道):消息推送使用的通道
Exchange(交换器):用于接受、分配消息
Queue(队列):用于存储生产者的消息
RoutingKey(路由键):用于把生产者的数据分配到交换器上
BindKey(绑定键):用于把交换器的消息绑定到队列上

138.rabbitmq 中 vhost 的作用是什么?
vhost可以理解为虚拟broker,即mini-RabbitMQ server,其内部均含有独立的queue、bind、exchange等,最重要的是拥有独立的权限系统,可以做到vhost范围内的用户控制。当然,从RabbitMQ全局角度,vhost可以作为不同权限隔离的手段(一个典型的例子,不同的应用可以跑在不同的vhost中)。

139.rabbitmq 的消息是怎么发送的?
首先客户端必须连接到RabbitMQ服务器才能发布和消费信息,客户端和rabbitserver之间会创建一个TCP连接,一旦tcp打开并通过认证(认证就是你发送给rabbit服务的用户和密码,)你的客户端和RabbitMQ就创建了一条amqp 信道(channel),信道是创建在‘真实’tcp上的虚拟连接,amqp命令都是通过信道发送出去的,每个信道都会有一个唯一的id,不论是发布消息,订阅列都是通过这个信道完成的。
140.rabbitmq 怎么保证消息的稳定性?
提供了事务的功能。
通过将 channel 设置为 confirm(确认)模式。
141.rabbitmq 怎么避免消息丢失?
消息持久化
ACK确认机制
设置集群镜像模式
消息补偿机制

142.要保证消息持久化成功的条件有哪些?
声明队列必须设置持久化 durable 设置为 true.
消息推送投递模式必须设置持久化,deliveryMode 设置为 2(持久)。
消息已经到达持久化交换器。
消息已经到达持久化队列。
以上四个条件都满足才能保证消息持久化成功。
143.rabbitmq 持久化有什么缺点?
持久化的缺地就是降低了服务器的吞吐量,
因为使用的是磁盘而非内存存储,
从而降低了吞吐量。可尽量使用 ssd 硬盘来缓解吞吐量的问题。
144.rabbitmq 有几种广播类型?
三种广播模式:

1 fanout: 所有bind到此exchange的queue都可以接收消息
(纯广播,绑定到RabbitMQ的接受者都能收到消息);
2 direct: 通过routingKey和exchange决定的那个唯一的queue可以接收消息;
3 topic: 所有符合routingKey(此时可以是一个表达式)的routingKey所bind的queue可以接收消息;

145.rabbitmq 怎么实现延迟消息队列?
通过消息过期后进入死信交换器,
再由交换器转发到延迟消费队列,实现延迟功能;
使用 RabbitMQ-delayed-message-exchange 插件实现延迟功能。

146.rabbitmq 集群有什么用?
集群主要有以下两个用途:
高可用:某个服务器出现问题,整个 RabbitMQ 还可以继续使用;
高容量:集群可以承载更多的消息量。

147.rabbitmq 节点的类型有哪些?
磁盘节点:消息会存储到磁盘。
内存节点:消息都存储在内存中,重启服务器消息丢失,性能高于磁盘类型

148.rabbitmq 集群搭建需要注意哪些问题?
各节点之间使用“–link”连接,此属性不能忽略。
各节点使用的 erlang cookie 值必须相同,此值相当于“秘钥”的功能,用于各节点的认证。
整个集群中必须包含一个磁盘节点

149.rabbitmq 每个节点是其他节点的完整拷贝吗?为什么?
不是,原因有以下两个:
存储空间的考虑:如果每个节点都拥有所有队列的完全拷贝,
这样新增节点不但没有新增存储空间,反而增加了更多的冗余数据;
性能的考虑:如果每条消息都需要完整拷贝到每一个集群节点,
那新增节点并没有提升处理消息的能力,最多是保持和单节点相同的性能甚至是更糟。

150.rabbitmq 集群中唯一一个磁盘节点崩溃了会发生什么情况?
如果唯一磁盘的磁盘节点崩溃了,不能进行以下操作:
不能创建队列
不能创建交换器
不能创建绑定
不能添加用户
不能更改权限
不能添加和删除集群节点
唯一磁盘节点崩溃了,集群是可以保持运行的,但你不能更改任何东西

151.rabbitmq 对集群节点停止顺序有要求吗?
RabbitMQ 对集群的停止的顺序是有要求的,
应该先关闭内存节点,最后再关闭磁盘节点。如果顺序恰好相反的话,可能会造成消息的丢失。
十七、MySql
164.数据库的三范式是什么?
A。原子性,列不可再分割
B。一是表必须有一个主键;二是没有包含在主键中的列必须完全依 赖于主键,而不能只依赖于主键的一部分。
C。另外非主键列必须直接依赖于主键,不能存在传递依赖
1.第一范式,确保每列保持原子性。 2.第二范式,确保表中的每列都和主键相关。 3.第三范式,确保每列都和主键列直接相关,而不是间接相关

165.一张自增表里面总共有 7 条数据,删除了最后 2 条数据,重启 mysql 数据库,又插入了一条数据,此时 id 是几?
8
166.如何获取当前数据库版本?
select version();
mysql -v

167.说一下 ACID 是什么?
A。原子性,事务中操作数据,要么全部成功,要么全部失败
B。一致性,事务中数据前后一致
C。隔离性,事务中,各个事务之间是相互隔离的
D。持久性,事务一旦提交对数据的改变将是永久的

168.char 和 varchar 的区别是什么?
固定长度,可变长度

169.float 和 double 的区别是什么?
double 和 float 的区别是double精度高,有效数字16位,float精度7位。但double消耗内存是float的两倍,double的运算速度比float慢得多

170.mysql 的内连接、左连接、右连接有什么区别?
1.内连接,显示两个表中有联系的所有数据;
2.左链接,以左表为参照,显示所有数据,右表中没有则以null显示
3.右链接,以右表为参照显示数据,,左表中没有则以null显示

1.内连接只显示两表中有关联的数据
select * from table1 inner join table2 on table1.字段1 = table2.字段2;
2.左连接显示左表所有数据,右表没有对应的数据用NULL补齐,多了的数据删除
select * from table1 left join table2 on table1.字段1 = table2.字段2;
3.右连接显示右表所有数据,左表没有对应的数据用NULL对齐,多了的数据删除
select * from table1 left join table2 on table1.字段1 = table2.字段2;

171.mysql 索引是怎么实现的?
mysql索引采用的是B+tree,InnoDB的数据文件本身就是索引文件。从上文知道,MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。而在InnoDB中,表数据文件本身就是按B+Tree组织的一个索引结构,这棵树的叶结点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。

172.怎么验证 mysql 的索引是否满足需求?
使用方法,在select语句前加上explain就可以了

173.说一下数据库的事务隔离?
脏读:事务A读取了事务B未提交的数据
幻读:事务A读取了事务B新插入的数据
不可重复读:事务中多次查询读取到的数据不一样

174.说一下 mysql 常用的引擎?
Innodb和MyIASM
a.Innodb引擎,Innodb引擎提供了事务的支持。并且还提供了行级锁和外键的约束。
b.MyIASM引擎,但不提供事务的支持,也不支持行级锁和外键。表锁,支持全文索引

175.说一下 mysql 的行锁和表锁?
表级锁:每次操作锁住整张表。开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低;
行级锁:每次操作锁住一行数据。开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高.

176.说一下乐观锁和悲观锁?
A。总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁(共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程)。

B。总是假设最好的情况,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号机制和CAS算法实现

177.mysql 问题排查都有哪些手段?
使用 show processlist 命令查看当前所有连接信息。
使用 explain 命令查询 SQL 语句执行计划。
开启慢查询日志,查看慢查询的 SQL。

178.如何做 mysql 的性能优化?
为搜索字段创建索引。
避免使用 select *,列出需要查询的字段。
垂直分割分表。
选择正确的存储引擎。
强制类型转换会导致全表扫描
如果只有一条返回结果,limit 1能够提高效率
尽量避免在where子句中使用or来连接条件
尽量避免在where子句中进行表达式操作
尽量避免在where子句中使用!= .<>操作符
使用联合索引时遵循最左前缀原则
保证不重复的情况下 尽量用union all 代替unio
索引不宜太多,一般5个以内
在属性上进行计算不能命中索引
前导模糊查询不能命中索引
179:索引有哪些?
A。普通索引
B。全文索引
C。主键索引
D。联合索引

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值