1.在支付过程中,出现支付超时解决方案
出现场景:用户停留在支付页面15分钟之后再支付,就会出现用户付款,后台把该订单给取消了(使用rabbitMQ延迟队列,下单时间+15即为超时时间)
解决方案:
支付宝
支付宝支付接口有提供一个绝对超时时间字段,超过这个时间支付宝就会返回支付超时
微信
微信支付接口有提供交易开始时间和交易结束时间,超过这个时间微信就会返回支付超时
2.订单支付成功,没有收到异步通知,超过设置时间,后台把订单取消,之后又收到通知解决方案
方案一:判断订单的状态,只有是未支付的状态才更新为已支付
3.谈一下对webService理解,发布服务怎么实现的
理解:webService是一种跨编程语言和跨操作系统平台的远程调用技术
发布服务实现方式:
- 创建一个返回类型的实体类对象
- 创建服务对象,并建立获取相关信息的方法(类上使用@WebService)
- 运行发布
- 使用jdk的bin目录下自带的wsimport.exe将其生成.java文件
- 建立调用服务的模拟客户端(新建一个项目)将生成的文件拷入"客户端"
- 建立测试类进行访问调用
参考文章:https://blog.csdn.net/sinat_35821285/article/details/79318902
4.mybatis中resultMap和resultType区别
resultMap:适合使用返回值是自定义实体类的情况
resultType:适合使用返回值得数据类型是非自定义的,即jdk的提供的类型
resultMap :
映射实体类的数据类型
resultMap的唯一标识
column: 库表的字段名
property: 实体类里的属性名
- 多线程的实现方式,线程池有哪些参数,cashThreadPool队列是有序队列还是无序
- 继承Thread类,重写run方法
- 实现Runnable接口,重写run方法,
- 使用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();
- 使用线程池方式
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();
- 优化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解决查询的详细信息,也是关键参考项之一。
- Join on 和join where 区别
Join on是先执行on后面的条件再进行连接查询
Join where 是先连接查询再执行后面的条件
- 常用的设计模式有哪些?单例模式有几种,各有什么优点,缺点
- ConCurrentHashMap为什么是线程安全
- 说一下秒杀活动怎么实现的(并发处理机制,10000个人同时秒杀,库存不够),怎么控制并发,加入库存只有五件怎么控制先后顺序
- 将商品id作为key,库存token作为vaule存到redis中
- 秒杀的时候,使用leftpop()方法从redis中取出库存token,若为空则说明秒杀完了,若不为空,加入到消息队列中,异步处理更新库存和生成订单
- for 和 foreach区别(效率、功能方面)
foreach适用于只是进行集合或数组遍历,for则在较复杂的循环中效率更高。
foreach不能对数组或集合进行修改(添加删除操作),如果想要修改就要用for循环
- StringBuffer和StringBuilder区别,底层数据结构
- 线程安全,StringBuffer:线程安全,StringBuilder:线程不安全。因为 StringBuffer 的所有公开方法都是 synchronized 修饰的,而 StringBuilder 并没有 StringBuilder 修饰。
- 缓冲区:StringBuffer每次获取toString都会直接使用缓存区的toStringCache值来构造一个字符串,StringBuilder每次需要复制一次字符数组,再构造一个字符串
- 性能:因为StringBuffer是线程安全的,访问的时候都加了锁,所以StringBuilder性能大于StringBuffer
- RabbitMQ多个消息超时或阻塞没有消费
设置消息超时时间
- RabbitMQ重复消息消费问题