1.sql语句的优化?
答案:(1)where子句中:where表之间的连接必须写在其他where条件之前,那样可以过滤掉最大数量记录的条件必须写在where子句的末尾having之后。
(2)使用exist替代in,用not exist替代not in(exist查询条件的时候使用了索引,速度更快)
(3)避免使用索引上使用计算
(4)避免在索引上添加 null 和not null
(5)对查询进行优化,应尽量避免全盘扫描,首先应该考虑在where和order by涉及的列上建立索引
(6)应尽量避免在where子句使用对字段进行null值判断,否则将导致引擎放弃使用索引转而使用全盘扫描
(7)应避免在where子句字段进行表达式操作,将导致引擎放弃使用索引转而使用全盘扫描
2.JSON 与 JS 对象的关系
1
|
var obj = {a: 'Hello' , b: 'World' }; //这是一个对象,注意键名也是可以使用引号包裹的 |
1
|
var json = '{"a": "Hello", "b": "World"}' ; //这是一个 JSON 字符串,本质是一个字符串 |
JSON 和 JS 对象互转
1
|
var obj = JSON.parse( '{"a": "Hello", "b": "World"}' ); //结果是 {a: 'Hello', b: 'World'} |
1
|
var json = JSON.stringify({a: 'Hello' , b: 'World' }); //结果是 '{"a": "Hello", "b": "World"}' |
3.创建线程的几种方式
一般有四种方法,Thread,Runnable,Callable,使用Executor框架来创建线程池。
Runnable和Callable的区别是,
(1)Callable规定的方法是call(),Runnable规定的方法是run().
(2)Callable的任务执行后可返回值,而Runnable的任务是不能返回值得
(3)call方法可以抛出异常,run方法不可以
(4)运行Callable任务可以拿到一个Future对象,表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并检索计算的结果。通过Future对象可以了解任务执行情况,可取消任务的执行,还可获取执行结果。
4.@Autowired和@Resources的区别:
@Autowired默认按照类型进行注入,如果需要使用名称来进行查找,则需要配合使用@Qualifier(name="被代理类对象 ")使用
@Resources默认使用名称进行注入,名称找不到会按照类型进行注入,如果使用了名称则按照名称注入
5.AcriveMq是什么?为什么要是用AcriveMq?
概述:ActiveMq是基于java中的JMS消息服务规范实现的一个消息中间件
ActiveMq的优势:
(1)解耦合:上层发送方不用去关心下层服务调用方的问题
(2)异步调用:各个微服务之间所需要的时间(即时效性要求不同),使用Mq的异步调用合理处理
(3)流量削峰:大型数据访问的时候,使用消息中间件,超出消息中间件排队等候,减小服务器压力
AcriveMq消息发送方式和区别:
(1)点对点模式(Queue):每个消息只有一个消费者,消息保证送达,离线消费者可以在下次上线后收到之前积压的消息
(2)订阅模式(Topic):
普通订阅:不区分消费者,当前有几个客户端在线,就发送几条广播给客户端。
持久化订阅: 区分消费者,消费者在线则直接发送消息广播给消费者,消费者离线,只要该消费者有topic 登记,就会为其保留消息直至其再次连接后一次性推送,消息可以积压。
6.Spring如何管理事务:
- 编程式事务管理: 直接使用PlatformTransactionManager实现或使用TransactionTemplate模板类
- 声明式事务管理: 这意味着你的业务代码将于事务管理分开,只用注解或基于XML配置来管理事务
-
我们项目中使用的是声明式事务管理,它通过注解@Transcation 将事务管理代码从业
务方法中分离出来,以声明的方式来实现事务管理。事务管理作为一种横切关注点,可
以通过 AOP 方法模块化。Spring 通过 Spring AOP 框架支持声明式事务管理
7.为什么使用redis?
(1)读写性能高:每秒读写10万数据量
(2)丰富的数据类型:包含5种数据类型:String,list,hash,set,zest
(3)原子性:redis存储数据要么全部成功,要么全部失败回滚
(4)丰富的特性:redis还包含publish/subscribe(发布/订阅),通知,key过期处理等。