面试题目总结


面试题目笔记

1.NIO、AIO、BIO

BIO:同步阻塞IO,服务器端一个线程来处理一个Socket请求,服务器端的accept方法、write()、read方法都存在阻塞。同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。

NIO:同步非阻塞IO,基于时间驱动的思想。解决BIO的大并发问题,再同步的I/O的网络应用中,如果同时处理多个客户端请求,或者在客户端要同时和多个服务器通信,需要多线程来处理。

NIO基于Reactor模型,其中使用的SocketChannel通道处理,通信消息会在多路复用器上,只需要一个线程来处理所有的连接请求。同步非阻塞,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理

AIO:异步非阻塞IO,异步非阻塞,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理

各自适应的场景:

BIO方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4以前的唯一选择,但程序直观简单易理解。

NIO方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂,JDK1.4开始支持。

AIO方式使用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂,JDK7开始支持。

2.select、poll、epoll

3.UDP、TCP的区别

4.Reentranlock锁升级过程以及原理

5.线程池的参数以及意义,现有的线程池

6.MVCC

多版本并发控制,是一个行级锁的变种,但其在很多情况下避免了加锁操作,降低了开销。

MVCC的实现:通过保存数据在某个时间点的快照实现的,也就是说,不管需要执行多长时间,每个事务看到的数据都是一样的。不同的存储引擎MVCC实现是不同的,一般有乐观并发控制和悲观并发控制。

InnoDB的MVCC:通过每行记录后面保存两个隐藏的列来实现,一列保存行的创建时间,一列保存行的过期时间,存储的并不是实际的时间值,而是系统的版本号。

插入操作:将新插入的每一行保存系统的版本号作为行版本号

删除操作:删除每一行保存当系统版本号为行删除标识(过期时间)

修改操作:插入新的记录,保存当前系统版本号作为行版本号,同时保存当前系统版本号为原来的行的行删除标识。

查询操作: 满足一下条件

1)只查找版本早于当前事务的数据行(也就是行的系统版本号小于风雨事务的系统版本号),保证数据在事务开启时存在或者自身修改过

2)行的删除版本要么未定义,要么大于当前事务版本号。可以确保事务读取到的行,在事务开始前没有被删除

7.MyISam和Innodb区别、事务的隔离级别

8.hashmap与hashtable区别,hashtable怎么实现的线程安全

9.concurrenthashmap底层

10.进程分配的是什么,进程拥有什么?

11.线程拥有什么,线程之间的同步

12.HTTP和Https的区别?

13.MySql插入一条数据怎么获取这条语句的id

spring相关

1.Spring中bean的生命周期

2.bean的作用域

3.bean单例时是线程安全的吗?

4.resource和autowried的区别

5.spring aop

6.注入的三种方式

7.springBoot自动配置

算法题目:

判断是不是回文数

判断单链表是不是回文

网络相关

网络相关图

项目:

mybatis执行流程:

mybatis执行流程如下:

1.首先通过new SqlSessionFactoryBuilder().builder(InputStream inputStream)用来构造SqlSessionFactory,返回的是DefaultSqlSessionFactory,在这个过程中已经创建了Configuration对象是通过XMLConfigBuilder的parse()方法创建的。

2.SqlSeaaionFactory.openSession()返回的sqlSession是DefaultSession类型的,此SqlSession里包含一个Configuration对象和一个Executor对象。

3.sqlSession.getMapper(Class<T> type);这个是创建mapper的方法,内部通过MappperProxyFactory(Mapper 代理工厂)来创建一个mapper接口的代理对象。

4.当执行mapper中相应的方法时,是通过反射执行的mapper代理对象的invoke方法,同时完成javaBean对象到数据库参数之间的相互转换,这种映射关系就是TypeHandler对象来完成的,在获取数据库表对应的元数据时,会保存该表所有数据库类型。

SqlSessionFactory —>SqlSession—>Executor —>StatementHandler—ParameterHandler/ResultHandler—>TypeHandler—–>原生的jdbc

Mybatis中的#与$符号的区别:

#号:预编译处理,Mybatis处理#时,将#{}替换成?号,调用PreparedStatement的set方法来赋值

$号:字符串替换,将${}替换成变量的值

#{}可以有效的放置SQL注入,提高系统的安全性

Mybatis的分页原理?

Mybatis使用RowBounds对象进行分页,其针对ResultSet结果集执行的内存分页,并非物理分页,可以在sql内直接书写带有物理分页参数来完成物理分页功能,也可以使用分页插件完成物理分页。

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

批量操作:executortype.batch

sqlsession sqlsession = sqlsessionfactory.opensession(executortype.batch);

MyBatis实现一对一有几种方式?具体怎么操作的?

联合查询和嵌套查询

一对一

联合查询是几个表联合查询,只查询一次, 通过在resultMap里面配置association节点配置一对一的类就可以完成;

嵌套查询是先查一个表,根据这个表里面的结果的 外键id,去再另外一个表里面查询数据,也是通过association配置,但另外一个表的查询通过select属性配置。

一对多

联合查询是几个表联合查询,只查询一次,通过在resultMap里面的collection节点配置一对多的类就可以完成;

嵌套查询是先查一个表,根据这个表里面的 结果的外键id,去再另外一个表里面查询数据,也是通过配置collection,但另外一个表的查询通过select节点配置。


文章作者: it星
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 it星 !
 上一篇
消息中间件 消息中间件
it星
1.了解的知识点1.1 AMQP和JMSAMQP(Advanced Message Queuing Protocol)高级消息队列 AMQP,即Advanced Message Queuing Protocol,一个提供统一消息服务的应用
2020-08-29
下一篇 
swagger学习 swagger学习
Swagger最近分析一个前后端分离的项目,发现前后端项目中使用到Swagger,对该技术进行学习。 开源项目地址: 后端工程传送门、前端工程传送门 前后端分离:后端分层(服务层、数据层、控制层)、前端也进行分层(前端控制层、视图层) 前后
2020-08-24
  目录