2020/9/20 feirui.youzhong
挺舒服的面试。(这才是我的水平...)
- 自我介绍
- 做过哪些项目?描述一下?
- (项目相关)spring-security的执行流程?怎么进行的权限控制?
- MyBatis的#和$区别?哪个好?
- mysql的sql优化?
- mysql如果有一个表数据量特别大,应该怎么做?
- mysql的join?左外连接?右外连接?
- 索引?索引为什么快?
- .项目里哪里用到了多线程?两个线程同时访问了一个service,访问了同一张表,怎么处理?
- SpringBoot用过吗?SpringBoot的优势?
- 简单介绍一下你了解的Spring?
- ArrayList和LinkedList区别?哪个更占内存?
3.(项目相关)spring-security的执行流程?怎么进行的权限控制?
4.MyBatis的#和$区别?哪个好?
- #将传入的数据都当成一个字符串,会对自动传入的数据加一个单引号。
- $将传入的数据直接显示生成在sql中,是字符串直接拼接进去。
- #方式是用?占位符,进行替换,能够很大程度防止sql注入。
5.mysql的sql优化?
问到mysql必问 优化 和 索引
https://blog.csdn.net/qq_43220949/article/details/108605953 第6个
6.mysql如果有一个表数据量特别大,应该怎么做?
1.分区:分区是将一个表或索引分解成多个更小,更可管理的部分。每个区都是独立的,可以独立处理,也可以作为一个更大对象的一部分进行处理。业务代码无需改动。
- RANGE分区:基于属于一个给定连续区间的列值,把多行分配给分区。
- LIST分区:类似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进行选择。
- HASH分区:基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算。
- KEY分区:KEY分区和HASH分区相似,不同之处在于HASH分区使用用户定义的函数进行分区,KEY分区使用数据库提供的函数进行分区。
详细 :https://blog.csdn.net/qq_43220949/article/details/108696052
2.分表
3.分库
7.索引?索引为什么快?
mysql使用的是B+树索引。
根据B+树的特点,查询快。
B+树特点:矮胖,层级更少,查询速度更稳定,天然具备排序功能,且叶子节点有指向周围叶子节点的指针,方便范围查询,全节点遍历更快。
- B+树的非叶子节点不保存关键字记录的指针,只进行数据索引。
- 所有数据地址必须要到叶子节点才能获取到。所以每次数据查询的次数都一样;
- B+树叶子节点的关键字从小到大有序排列,左边结尾数据都会保存右边节点开始数据的指针。
8.项目里哪里用到了多线程?两个线程同时访问了一个service,访问了同一张表,怎么处理?
eg:
你跟他说,如果做 java web 方面开发的话几乎用不到多线程!因为有多线程的地方 servlet 容器或者其他开发框架都已经实现掉了!
一般在网络应用程序中使用多线程的地方非常多!
另外,你说的拷贝文件使用多线程,那是没有用的!以多线程来提高效率的场景一般在 CPU 计算型,而不是在 IO 读写型。CPU 可以会有多个核心并行处理计算,但是磁盘 IO 就没这功能了,磁头只有一个,根本不可能靠多线程提高效率!
一般来说,磁盘 IO 的并发能力为 0,也就是说无法支持并发!网络 IO 的话由于带宽的限制的,使用多线程处理最多也只能达到带宽的极值。
对于磁盘 IO 来说,多线程可以用于一个线程专门用于读写文件,其他的线程用于对读取数据进行处理,这样才有可能更好地利用 CPU 资源。
如果仅仅是单纯的文件复制,使用多线程操作的话,会使用磁头在磁盘上不停地进行寻道操作,使得效率更为低下!----摘自CSDN问答:https://bbs.csdn.net/topics/390037268
多线程异步处理任务
当我们需要处理一个耗时操作并且不要立刻知道处理结果时,我们可以开启后台线程异步处理该耗时操作,这样可以提高用户体验。比如我之前做的一个项目需要上传简历附件,后台需要对简历附件进行解析,保存到数据表中,因为涉及多种格式的处理,所以我们开启多线程异步处理此操作,这样用户就不用等到我们的简历解析完就能看到服务端的响应了。再比如用户下载简历时,我们需要将数据表中的数据生成简历附件并且通过邮件发送到用户邮箱,该操作也可以开启多线程异步处理。
与主业务耦合性滴发邮件, 记录日志, 发短信等等。比如发邮件是个耗时的操作,如果在主业务中即要记录用户信息,又需要发邮件来通知用户,而且用户等待收取邮件,那么这是一个耗时的操作,对用户体验不好,这时就可以开启一个独立线程来发送邮件。
用户注册完成送大礼包/积分之类,且积分等也是另一个系统并比较耗时;且这类任务即使失败也不是特别重要的。
后台线程:比如定期执行一些特殊任务,如定期更新配置文件,任务调度(如quartz),一些监控用于定期信息采集等。
最典型的应用比如tomcat,tomcat内部采用的就是多线程,上百个客户端访问同一个web应用,tomcat接入后都是把后续的处理扔给一个新的线程来处理,这个新的线程最后调用到我们的servlet程序,比如doGet或者doPost方法。
如果不采用多线程机制,上百个人同时访问一个web应用的时候,tomcat就得排队串行处理了,那样客户端根本是无法忍受那种访问速度的。
还有就是需要异步处理的时候,需要使用多线程。比如task a和task b要并行处理,单个线程只能串行处理,先做完task a然后再做task b。如果想要多个task同时执行的话,就必须为每个task分配一个线程,然后通过java虚拟机的线程调度,来同时执行多个任务。比如你的CPU是多核心的话,就可以让一个CPU执行一个线程。如果只有一个CPU的话,底层是按照分时复用的原则,各个线程按照时间片来获得CPU资源。
- 两个线程同时访问了一个service,访问了同一张表,会出现什么问题?怎么处理?
在业务方法可以synchronized加锁,进行并发控制。
- 访问了同一张表,会出现什么问题?
出现 脏读,不可重复读,幻读。
- 怎么处理?
在MySQL数据库设置隔离级别,MySQL的隔离级别默认是可重复读。
MySQL的隔离级别有:
- 读未提交(Read Uncommitted): 其他事务未进行提交,也可以读取
- 读已提交(Read Committed) 其他事务提交后,才可以读取
- 可重复读(Repeatable Read) (默认) : 事务A在读到一条数据之后,此时事务B对该数据进行了修改并提交,那么事务A再读该数据,读到的还是原来的内容。
- 串行化 (Serializable) :完全放弃并发,事务依次串行执行。
## 查询隔离级别
select @@tx_isolation;
##设置隔离级别为 repeatable read 可重复读
set session transaction isolation level repeatable read;
##设置隔离级别为可序列化serializable
set session transaction isolation level serializable;
##还可以设置为 读已提交read committed 和 读未提交read uncommitted
9.SpringBoot用过吗?SpringBoot的优势?
- 配置变得简单了。使用封装好的starter代替了spring的各种配置复杂的xml
- springboot内嵌了servlet容器
独立运行的 Spring 项目
Spring Boot 可以以 jar 包的形式独立运行,运行一个 Spring Boot 项目只需通过 java–jar xx.jar 来运行。
10.ArrayList和LinkedList区别?哪个更占内存?
ArrayList查询快,增删慢。
LinkedList增删慢,查询快。
底层实现?查看https://blog.csdn.net/qq_43220949/article/details/108605953 第二题
- 哪个更占内存?
因为LinkedList每个节点要维护指向前后地址的两个节点,所占内存更大。但也不是绝对,因为ArrayList可能会有空余的容量,而LinkedList是随机内存,不需要事先分配内存。