面试试题汇总(1)
1、数据表中设立联合两个索引,这两个索引是否都有效?什么时候会使用索引,什么时候不会使用索引
联合索引需要遵循最左原则,即需要从左到右依次使用索引中的字段,也可以使用索引中的部分,但只能是最左侧的部分。
假设联合索引key(a,b,c),可以支持a|a,b|a,b,c三种组合进行查询,但不支持以b,c进行查询,即以b,c这种形式查询索引是无效的。
使用索引的情况:
①、全值匹配
②、范围匹配
③、联合索引,符合最左原则时
④、仅对索引列进行查询时
不使用索引的情况:
①、以%开头的like查询时
②、数据类型出现隐式转换时,比如varchar类型的字段a,当条件语句a=1时,不会使用索引,当条件语句a=“1” 时,会使用索引
③、不符合最左前缀原则时
④、查询条件有or分隔时,or前面的会使用到索引,or后面的不会使用索引,此时还是全表扫描,之前的索引可以忽略了
⑤、使用column_name is null 时
⑥、当mysql认为使用索引会比全表查询慢时
2、一条sql语句查询速率很慢,有什么优化方案?
首先使用explain分析该sql语句的执行效果,通过得出的结果进一步调优
调优思路:①、根据查询条件,建立适当的索引
②、sql语句调优
③、横向或则纵向分割表,减少表的尺寸
④、增加服务器内存,增加服务器CPU个数
⑤、提高网速
3、mybatis中like有哪几种实现写法?
①、name LIKE "%"#{name}"%"
②、name LIKE CONCAT('%',#{name},'%')
③、使用标签 <bind name="pattern" value="'%' + parameter.name + '%'" />
name LIKE #{pattern}
4、mybatis和hibernate各自的优缺点?
hibernate的优势在于移植性好、开发工作量上hibernate更专业于业务,无需关心SQL生成与结果映射
mybatis的优势在于SQL优化方面,Mybatis更灵活、可控性更好、更优化,学习成本较低,易上手
5、如何创建一个线程,开启一个进程有哪几种方式
创建线程有三种方式:继承Thread类、实现Runable接口、实现Callable接口
Thread t = new Thread();t.start()
Runable r = new Runable(); new Thread(r).start()
Callable c = new Callable();FutureTask<?> reault = new FutureTask<?>(c);new Thread(result).start()
6、了解的设计模式,单例模式有几种形式
单例模式有:①、懒汉式 ②、饿汉式 ③、静态内部类 ④、枚举 ⑤、双重校验锁
7、mybatis有几级缓存
mybatis的缓存分为一级缓存和二级缓存
一级缓存是SqlSession级别的缓存,默认开启,当同一个SqlSession执行两次相同的sql语句时,第一次执行完的数据会写到缓存,第二次查询时直接从缓存获取,不用再去从数据库查询,当SqlSession执行insert、update、delete操作并提交到数据库时,会清空缓存,以保证缓存中的信息是最新的。
二级缓存是mapper级别的缓存,需要手动开启,多个SqlSession可以共用二级缓存,其作用域是mapper的同一个namespace,当不同的SqlSession两次执行相同namespace下的sql语句,第二次查询只会查询第一次查询时读取数据库后写到缓存的数据,不会再去数据库查询。
8、redis和Memcached的区别
①、redis不仅支持k/v类型的数据,还提供了list、set、hash等数据结构的存储
②、redis支持数据备份,即master-slave模式的数据备份
③、redis支持数据的持久化
9、spring事务
https://baijiahao.baidu.com/s?id=1589785724536025953&wfr=spider&for=pc
使用注解@Transactional
propagation属性设置事务传播:①、REQUIRED:表示业务方法需要在一个事务中处理,默认值
②、NOT_SUPPORTED:表示业务方法不需要在一个事务中处理。
isolation属性设置隔离级别:①、ISOLOACTION_DEFULT:默认的隔离级别,使用数据库默认的隔离级别,Mysql默认是isolocation_repartable_read
②、ios_read_uncommited:会出现脏读、不可重复读、幻象读
③、isolacation_read_commited:sqlservice,oracle数据库的默认隔离级别,避免了脏读,但是会出现不可重复读、幻象读
④、isolocation_repartable_read:mysql默认隔离级别,避免了脏读、不可重复度,但是会出现幻象读
⑤、isolocation_serializable :可避免脏读、不可重复读、幻象读
10、nginx负载均衡、图片如何处理
nginx通过反向代理实现负载均衡,有关于负载均衡的策略有:①、默认策略--轮询 ②、最少连接 ③、weight权重 ④、ip_hash ⑤、url_hash ⑥、fail
nginx提供地址映射功能,可作为资源服务器使用,通过local中关于图片的映射,可进行图片的访问。
11、并发的同步问题如何解决。
主要使用锁机制,锁机制有两个层面,一种是代码层面,如java中的同步锁,使用关键字synchronized
另一种是数据库层面上,比较典型的就是悲观锁和乐观锁。
悲观锁通过sql语句for update来控制,缺点是大量消耗数据库的性能。
乐观锁通过数据版本version记录机制实现,提交时版本号加1,此时如果版本号大于数据库当前版本,则给予更新,否则认为是过期数据,驳回更新。
最好将乐观锁策略在数据库存储过程中实现,对外只开放基于此存储过程的更新途径。
12、struts2与springmvc的区别
struts2是类级别的拦截,基于filter实现。变量共享
springmvc是方法级别的拦截,基于servlet实现,变量独立,方便的处理ajax请求,只需@responseBody
springmvc的工作流程:①、客户端发送http请求至服务器端,web服务器对http请求进行解析,如果匹配的dispatchServlet的请求映射路径,则转交给dispatchServlet
②、dispatchServlet根据HanderMapping找到相应的Handler,再由具体的HandlerAdapter对Handler进行具体调用
③、Handler对数据处理完之后返回一个ModelAndView()对象给DispatchServlet,通过ViewResolver将视图转换为真正的view,最终将完整的view返回给客户端
13、产生死锁的原因
14、java虚拟机的内部结构
①、类加载子系统(class loader)
②、运行时数据区(runtime date area),
其中包括:a、程序计数器(progarm counter degister)
b、java虚拟机栈 (java stack)
c、本地方法栈(native method stack)
d、堆(heap)
e、方法区(method area)(运行时常量池)
③、执行引擎(execution engine)
④、本地方法接口(native interface)
15、SpringAOP的实现策略及用途
Spring AOP的实现策略
Spring默认采取JDK动态代理来实现AOP,当JDK动态代理不可用(代理类无接口)的时候,使用CGlib动态代理机制。
JDK动态代理:通过反射机制调用目标类的代码,动态将横切逻辑和业务逻辑编制到一起,其有个限制即只能为接口生成动态代理。
CGlib动态代理:在运行时动态生成指定类的一个子类对象,并覆盖其中特定方法,覆盖方法是可以添加增强代码,从而实现AOP。
Spring的AOP的用途
1、记录日志
2、性能监控
3、缓存代理
4、软件破解
5、权限校验

浙公网安备 33010602011771号