Java2021中级面试题

1.在支付过程中,出现支付超时解决方案

出现场景:用户停留在支付页面15分钟之后再支付,就会出现用户付款,后台把该订单给取消了(使用rabbitMQ延迟队列,下单时间+15即为超时时间)

解决方案:

支付宝

支付宝支付接口有提供一个绝对超时时间字段,超过这个时间支付宝就会返回支付超时

微信

微信支付接口有提供交易开始时间和交易结束时间,超过这个时间微信就会返回支付超时

2.订单支付成功,没有收到异步通知,超过设置时间,后台把订单取消,之后又收到通知解决方案

方案一:判断订单的状态,只有是未支付的状态才更新为已支付

3.谈一下对webService理解,发布服务怎么实现的

理解:webService是一种跨编程语言和跨操作系统平台的远程调用技术

发布服务实现方式:

  1. 创建一个返回类型的实体类对象
  2. 创建服务对象,并建立获取相关信息的方法(类上使用@WebService)
  3. 运行发布
  4. 使用jdk的bin目录下自带的wsimport.exe将其生成.java文件
  5. 建立调用服务的模拟客户端(新建一个项目)将生成的文件拷入"客户端"
  6. 建立测试类进行访问调用

参考文章:https://blog.csdn.net/sinat_35821285/article/details/79318902

4.mybatis中resultMap和resultType区别

resultMap:适合使用返回值是自定义实体类的情况

resultType:适合使用返回值得数据类型是非自定义的,即jdk的提供的类型

resultMap : 

映射实体类的数据类型

resultMap的唯一标识

column: 库表的字段名

property: 实体类里的属性名

  1. 多线程的实现方式,线程池有哪些参数,cashThreadPool队列是有序队列还是无序
  1. 继承Thread类,重写run方法
  2. 实现Runnable接口,重写run方法,
  3. 使用Callable和FutureTask创建多线程

实现步骤:

a:创建Callable接口的实现,并实现call()方法

Callable<Integer> myCallable = new MyCallable();    // 创建MyCallable对象

FutureTask<Integer> ft = new FutureTask<Integer>(myCallable); //使用FutureTask来包装MyCallable对象

Thread thread = new Thread(ft);

thread.start();   

  1. 使用线程池方式

ExecutorService executorService = Executors.newFixedThreadPool(5);

for(int i = 0; i<POOL_NUM; i++) {              

RunnableThread thread = new RunnableThread();

             //Thread.sleep(1000);             executorService.execute(thread);         

}          

//关闭线程池          

executorService.shutdown();

 

  1. 优化Sql一般是怎么实现的方式

创建索引

Mysql查看sql语句执行效率,在sql语句前加上explain

对应字段名称:

Id:查询序列号

 

Select_type:查询的类型

为simple:简单查询(不使用union或子查询等)

   Primary:最外面的查询

   UNION:UNION中的第二个或后面的SELECT语句

DEPENDENT UNION:UNION中的第二个或后面的SELECT语句,取决于外面的查询

UNION RESULT:UNION的结果。

SUBQUERY:子查询中的第一个SELECT

DEPENDENT SUBQUERY:子查询中的第一个SELECT,取决于外面的查询

DERIVED:导出表的SELECT(FROM子句的子查询)

 

table:显示这一行的数据是关于哪张表的

type:这列最重要,显示了连接使用了哪种类别,有无使用索引,是使用Explain命令分析性能瓶颈的关键项之一。

结果值从好到坏依次是:

system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL

一般来说,得保证查询至少达到range级别,最好能达到ref,否则就可能会出现性能问题。

possible_keys:列指出MySQL能使用哪个索引在该表中找到行

key:显示MySQL实际决定使用的键(索引)。如果没有选择索引,键是NULL

key_len:显示MySQL决定使用的键长度。如果键是NULL,则长度为NULL。使用的索引的长度。在不损失精确性的情况下,长度越短越好

ref:显示使用哪个列或常数与key一起从表中选择行。

rows:显示MySQL认为它执行查询时必须检查的行数。

Extra:包含MySQL解决查询的详细信息,也是关键参考项之一。

  1. Join on 和join where 区别

Join on是先执行on后面的条件再进行连接查询

Join where 是先连接查询再执行后面的条件

  1. 常用的设计模式有哪些?单例模式有几种,各有什么优点,缺点
  2. ConCurrentHashMap为什么是线程安全
  3. 说一下秒杀活动怎么实现的(并发处理机制,10000个人同时秒杀,库存不够),怎么控制并发,加入库存只有五件怎么控制先后顺序
  1. 将商品id作为key,库存token作为vaule存到redis中
  2. 秒杀的时候,使用leftpop()方法从redis中取出库存token,若为空则说明秒杀完了,若不为空,加入到消息队列中,异步处理更新库存和生成订单
  1. for 和 foreach区别(效率、功能方面)

foreach适用于只是进行集合或数组遍历,for则在较复杂的循环中效率更高。

foreach不能对数组或集合进行修改(添加删除操作),如果想要修改就要用for循环

 

  1. StringBuffer和StringBuilder区别,底层数据结构
  1. 线程安全,StringBuffer:线程安全,StringBuilder:线程不安全。因为 StringBuffer 的所有公开方法都是 synchronized 修饰的,而 StringBuilder 并没有 StringBuilder 修饰。
  2. 缓冲区:StringBuffer每次获取toString都会直接使用缓存区的toStringCache值来构造一个字符串,StringBuilder每次需要复制一次字符数组,再构造一个字符串
  3. 性能:因为StringBuffer是线程安全的,访问的时候都加了锁,所以StringBuilder性能大于StringBuffer
  1. RabbitMQ多个消息超时或阻塞没有消费

   设置消息超时时间

  1. RabbitMQ重复消息消费问题

 

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值