前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java面试:2021.05.25

Java面试:2021.05.25

原创
作者头像
夕梦
修改2021-05-27 18:04:11
4400
修改2021-05-27 18:04:11
举报
文章被收录于专栏:每日面试每日面试

1、你们项目中为什么要用MQ?

消息队列的作用是系统解耦、同步改异步、请求消峰,举个下订单的例子: 前端获取用户订单信息,请求后端的订单创建接口。这个接口并不直接请求订单服务,而是首先生成唯一订单编号,再组装一个订单消息并发送给MQ,然后返回唯一订单编号给前端。前端会根据唯一订单编号轮询订单状态接口,如果订单创建成功,则拉起支付界面引导用户付款。作为消费者,订单服务收到订单消息后,开始检查参数、检查库存、生成订单等等核心业务流程。 解耦体现在订单创建接口并没有直接访问订单服务,使得它不用关注订单服务接口的变化。由于不是直接调用,同步操作变成了异步操作。试想一下,订单创建状态是同步返回的,用户界面必然卡起来。由于消息队列允许消息堆积,即使大量的用户订单涌过来,订单服务依然能够稳步的处理订单消息。

2、讲一下Spring里面bean的作用域?

Spring支持如下5种作用域:

(1)singleton:默认作用域,单例 bean,每个容器中只有一个 bean 的实例。

(2)prototype:每次用到 bean 都创建一个新实例。

(3)request:为每一个 request 请求创建一个实例

(4)session:为每个 session 创建一个实例

(5)application 为每个 servletContext 创建一个实例

global-session:目前的 spring 版本已不支持

3、线程有哪几种状态?

1. 初始(NEW):新创建了一个线程对象,但还没有调用start()方法。 2. 运行(RUNNABLE):Java线程中将就绪(ready)和运行中(running)两种状态笼统的称为“运行”。 线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取CPU的使用权,此时处于就绪状态(ready)。就绪状态的线程在获得CPU时间片后变为运行中状态(running)。 3. 阻塞(BLOCKED):表示线程阻塞于锁。 4. 等待(WAITING):进入该状态的线程需要等待其他线程做出一些特定动作(通知或中断)。 5. 超时等待(TIMED_WAITING):该状态不同于WAITING,它可以在指定的时间后自行返回。 6. 终止(TERMINATED):表示该线程已经执行完毕。

4、过滤器和拦截器区别和项目中如何应用。

1:区别

(1)拦截器是基于java的反射机制的,而过滤器是基于函数回调。

(2)拦截器不依赖于servlet容器,而过滤器依赖于servlet容器。

(3)拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。

(4)拦截器可以访问action上下文、值栈里的对象,而过滤器不能。

(5)在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。

2:使用场景

1、日志记录:记录请求信息的日志,以便进行信息监控、信息统计、计算PV(Page View)等。

2、权限检查:如登录检测,进入处理器检测检测是否登录,如果没有直接返回到登录页面;

3、性能监控:有时候系统在某段时间莫名其妙的慢,可以通过拦截器在进入处理器之前记录开始时间,在处理完后记录结束时间,从而得到该请求的处理时间(如果有反向代理,如apache可以自动记录);

4、通用行为:读取cookie得到用户信息并将用户对象放入请求,从而方便后续流程使用,还有如提取Locale、Theme信息等,只要是多个处理器都需要的即可使用拦截器实现。

5、Nginx实现Tomcat集群的负载均衡有几种方式,你们项目中使用的是那种方式。

一,如果可以避免使用 session,直接用 nginx 的负载均衡策略即可

nginx负载均衡策略主要分一下六种:

1)轮询(默认)请求按顺序轮流发给每个后端服务器

2)权重,在轮询的基础上添加,权重高的分到的请求越多

3)ip_hash 每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器。

4)least_conn 把请求分给连接数最少的服务器

5)fair (第三方)按后端服务器的响应时间来分配请求,响应时间短的优先分配。

6)url_hash (第三方)按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。

二,如果涉及到用户session,做一些鉴权缓存、存放临时信息时,就必须做tomcat的session共享。

目前可参考到的session共享方式主要分为两种。

1)利用tomcat自带的组播机制,实现session复制。

对tomcat及应用的若干配置文件进行配置即可实现,网上有很多资料可参考。但这种方式有不少弊端,仅适合小规模集群

2)利用第三方机制存储session。

比如说使用 spring-session 集成 redis 来实现

6、mysql有关权限的表都有哪几个?

MySQL服务器通过权限表来控制用户对数据库的访问,权限表存放在mysql数据库里,由mysql_install_db脚本初始化。这些权限表分别user,db,table_priv,columns_priv和host。下面分别介绍一下这些表的结构和内容:

    user权限表:记录允许连接到服务器的用户帐号信息,里面的权限是全局级的。     db权限表:记录各个帐号在各个数据库上的操作权限。     table_priv权限表:记录数据表级的操作权限。     columns_priv权限表:记录数据列级的操作权限。     host权限表:配合db权限表对给定主机上数据库级操作权限作更细致的控制。这个权限表不受GRANT和REVOKE语句的影响。

7、MySQL的binlog有有几种录入格式?分别有什么区别?

有三种格式,statement,row和mixed。

    statement模式下,每一条会修改数据的sql都会记录在binlog中。不需要记录每一行的变化,减少了binlog日志量,节约了IO,提高性能。由于sql的执行是有上下文的,因此在保存的时候需要保存相关的信息,同时还有一些使用了函数之类的语句无法被记录复制。     row级别下,不记录sql语句上下文相关信息,仅保存哪条记录被修改。记录单元为每一行的改动,基本是可以全部记下来但是由于很多操作,会导致大量行的改动(比如alter table),因此这种模式的文件保存的信息太多,日志量太大。     mixed,一种折中的方案,普通操作使用statement记录,当无法使用statement的时候使用row。

8、你知道mysql有哪些常用数据类型吗?

1、整数类型,包括TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT,分别表示1字节、2字节、3字节、4字节、8字节整数。任何整数类型都可以加上UNSIGNED属性,表示数据是无符号的,即非负整数。 长度:整数类型可以被指定长度,例如:INT(11)表示长度为11的INT类型。长度在大多数场景是没有意义的,它不会限制值的合法范围,只会影响显示字符的个数,而且需要和UNSIGNED ZEROFILL属性配合使用才有意义。 例子,假定类型设定为INT(5),属性为UNSIGNED ZEROFILL,如果用户插入的数据为12的话,那么数据库实际存储数据为00012。

2、实数类型,包括FLOAT、DOUBLE、DECIMAL。 DECIMAL可以用于存储比BIGINT还大的整型,能存储精确的小数。 而FLOAT和DOUBLE是有取值范围的,并支持使用标准的浮点进行近似计算。 计算时FLOAT和DOUBLE相比DECIMAL效率更高一些,DECIMAL你可以理解成是用字符串进行处理。

3、字符串类型,包括VARCHAR、CHAR、TEXT、BLOB VARCHAR用于存储可变长字符串,它比定长类型更节省空间。 VARCHAR使用额外1或2个字节存储字符串长度。列长度小于255字节时,使用1字节表示,否则使用2字节表示。 VARCHAR存储的内容超出设置的长度时,内容会被截断。 CHAR是定长的,根据定义的字符串长度分配足够的空间。 CHAR会根据需要使用空格进行填充方便比较。 CHAR适合存储很短的字符串,或者所有值都接近同一个长度。 CHAR存储的内容超出设置的长度时,内容同样会被截断。

4、枚举类型(ENUM),把不重复的数据存储为一个预定义的集合。 有时可以使用ENUM代替常用的字符串类型。 ENUM存储非常紧凑,会把列表值压缩到一个或两个字节。 ENUM在内部存储时,其实存的是整数。 尽量避免使用数字作为ENUM枚举的常量,因为容易混乱。 排序是按照内部存储的整数。

5、日期和时间类型,尽量使用timestamp,空间效率高于datetime, 用整数保存时间戳通常不方便处理。 如果需要存储微妙,可以使用bigint存储。 看到这里,这道真题是不是就比较容易回答了。

9、创建索引有几种方式?详细介绍下。

创建索引有三种方式。

第一种方式:在执行CREATE TABLE时创建索引。

代码:CREATE TABLE user_index2 (     id INT auto_increment PRIMARY KEY,     first_name VARCHAR (16),     last_name VARCHAR (16),     id_card VARCHAR (18),     information text,     KEY name (first_name, last_name),     FULLTEXT KEY (information),     UNIQUE KEY (id_card) );

第二种方式:使用ALTER TABLE命令去增加索引。

代码:ALTER TABLE table_name ADD INDEX index_name (column_list);

第三种方式:使用CREATE INDEX命令创建。

代码:CREATE INDEX index_name ON table_name (column_list); 

10、你对MySQL的锁了解吗?了解多少?

1:全局锁 通常被用于全库逻辑备份,但是让整个库只读,会有两个问题:     主库上的备份,会使整个业务停摆。     从库上的备份,会造成备份期间,从库无法执行主库同步过来的bin log而造成主从延迟。

2:表级锁 MySQL里面的表级锁有两种,一种是表锁,一种是MDL元数据锁。(Meta data lock) 整张表上锁,不仅限制其他线程的操作,同时也限制本线程的操作。 锁只有在事务提交的时候,才会释放。所以长事务会一直占用锁。 所以修改表结构的时候,要注意,不要阻塞线上正在执行的增删改查操作。

3:行锁 行锁是存储引擎层实现的,所以这也是为什么要用InnoDB引擎来代替MyISAM引擎的原因之一。 有两个事务都在更改同一条热点数据。这个时候,会出现阻塞现象。 在InnoDB引擎中,行锁是需要的时候加上的,但是释放锁的时候,却是事务结束的时候才释放。 所以如果一个事务要锁多个行,要把最可能造成锁冲突的语句放到后面,这样可以减少阻塞的时间。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、你们项目中为什么要用MQ?
  • 2、讲一下Spring里面bean的作用域?
  • 3、线程有哪几种状态?
  • 4、过滤器和拦截器区别和项目中如何应用。
  • 5、Nginx实现Tomcat集群的负载均衡有几种方式,你们项目中使用的是那种方式。
  • 6、mysql有关权限的表都有哪几个?
  • 7、MySQL的binlog有有几种录入格式?分别有什么区别?
  • 8、你知道mysql有哪些常用数据类型吗?
  • 9、创建索引有几种方式?详细介绍下。
  • 创建索引有三种方式。
  • 第一种方式:在执行CREATE TABLE时创建索引。
  • 第二种方式:使用ALTER TABLE命令去增加索引。
  • 第三种方式:使用CREATE INDEX命令创建。
  • 10、你对MySQL的锁了解吗?了解多少?
相关产品与服务
云数据库 MySQL
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档