标签:复合 pass 项目 这不 影响 访问 link jsp页面 model1
Java面试题01.面试的整体流程
Java面试题02.java的垮平台原理
Java面试题03.搭建一个java的开发环境
Java面试题04.java中int占几个字节
Java面试题05.java面向对象的特征
Java面试题06.装箱和拆箱
Java面试题07.==和equals的区别
Java面试题08.String和stringBuilder的区别(final)?stringBuffer和stringBuilder的区别?
1、在java中提供三个类string,stringBuilldel,stringBuffer来表示和操作字符串,字符串就是多个字符的集合
String是内容不可变的字符串,string底层使用了一个不可变的字符串数组(final char[])
String str=new string(“bbb”);
而stringBuillder,stringBuffer,是内容可以改变的字符串,stringBuillder,stringBuffer底层使用的可变的字符数组(没有使用final来修饰)
2、最经典就是拼接字符串
1、 string进行拼接string c=”a”+“b”;
2、 stringBuilder或者stringBuffer
stringBuilder sb=new stringBuilder();sb.apend(“a”).apend(“b”)
拼接字符串不能使用string进行拼接,要使用stringBuilder或者stringBuffer
3、StringBuilder是线程不安全的,效率较高,而stringBuffer是线程安全的,效率较低
Java面试题09.讲一下java中的集合
Java中的集合分为value,key-value(conllection map)两种
存储值有分为list和set
List是有序的,可以重复的
Set是无序的,不可以重复的。根据equals和hashcode判断,也就是如果一个对象要存储在set中,必须重写equals和hashcode方法
存储key-value的为map
Java面试题10.ArrayList 和LinkedList的区别
List常用的ArrayList和LinkedList。区别和使用场景?
Arraylist底层使用时数组。Linkedlist使用的是链表
数组查询具有所有查询特定元素比较快,而插入、删除和修改比较慢(数组在内存中是一块连续的内存,如果插入或删除是需要移动内存)。
链表不要求内存是连续的,在当前元素中存放下一个或上一个元素的地址,查询时需要从头部开始,一个一个的找,所以查询效率低,插入时不需要移动内存,只需改变引用指向集可,所以插入或者删除的效率高。
Arraylist使用在查询比较多,但是插入和删除比较少的情况,而linkedlist使用在查询比较少而插入和删除比较多的请况
Java面试题11.HashMap和HashTable的区别?HashTable和ConcurrentHashmap(1.5后)的区别?
相同点:hashmap和hasheTalbe都可以使用来存储key-value的数据
区别:
1、 hashmap是可以把null作为key或者value的,而HashTable是不可以的。
2、 Hashmap是线程不安全的,效率较高,而HashTalbe是线程安全的,效率较低
?我想线程安全但是我又想效率高?
通过把整个map分为N个segrnent(类似HashTable),可以提供相同的线程安全,但是效率提升N倍,默认提升16倍
Java面试题12.实现一个拷贝文件的工具类要使用字节流还是字符串
我们拷贝的文件不确定是只包含字符流,有可能有字节流(图片、声音、图像等)、为考虑通用性,要使用字节流
Java面试题13.线程的的实现方式?怎么启动线程?怎么区分线程?线程并发库
一、实现方式
1、 通过继承Thread类实现一个线程
2、 通过实现runnable接口实现一个线程
继承扩展性不强,java总只支持单继承,如果一个类继承thread就不能继承其他的类了。
二、怎么启动?
Thread thread=new Thread(继承了Thread的对象/实现了runnable的对象)
Thread.setName(“设置一个线程名称”);
Thread.start();
启动线程使用 start方法,而启动了以后执行的是run方法
三、怎么区分线程?在一个系统中有很多线程,每个线程都会打印日志,我想区分是哪个线程打印的怎么办?
Thread.setName(“设置一个线程名称”)这是一种规范,在创建线程完成后,都需要设置名称
Java面试题14.线程并发库和线程池的作用
Java面试题15.设计模式和常用的设计模式
单例(饱汉模式,饥汉模式)
1、 构造方法私有化,让出了自己类中能创建外其他地方都不能创建
2、 在自己的类中创建一个单实例(饱汉模式是一出来就创建单实例,而饿汉模式需要的时候才创建)
3、 提供一个方法获取该实例对象(创建时需要进行方法同步)
工厂模式spring IOC就是使用了工厂模式
对象的创建交给一个工厂去创建
代理模式spring AOP 就是使用的动态代理
Java面试题16.http get post请求的区别
Java面试题17.说说你对Servlet的理解
Servlet是用java编写的服务器端程序。而这些sevlet都要实现servlet这个接口,其主要功能在于交互式地浏览和修改数据,生成动态web内容,servlet运行与支持java的应用服务器
Httpservlet重写doget和dopost方法或者你也可以重写service方法完成对get和post请求的响应
Java面试题18.Servlet的生命周期
Servlet启动时,开始加载servlet生命周期开始。Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应doxxx方法等。当服务器决定将实例销毁的时候(服务器关闭)调用其destroy方法
加载servlet的class….>实例化servlet。。》调用servlet的init完成初始化。。。》响应请求(servlet的service方法)。。。》servlet容器关闭时(servlet的dostory方法)
Java面试题19.Servlet中forward和redirect的区别
Java面试题20.jsp和Servlet的相同点和不同点
Jsp是servlet技术的扩展,所有的jsp文件都会被翻译为一个继承HttpServlet的类,也就是jsp最终也是一个servlet这个servlet对外提供服务
Servlet和jsp最主要的不同点在于,servlet如果要实现html的功能,必须使用writer输出
对应的html,而jsp的情况是java和HTML可以组合成一个扩展名为jsp的文件。Jsp侧重于视图,servlet主要用于控制逻辑
Servlet和jsp最主要的不同点在于Jsp侧重于视图,servlet主要用于控制逻辑
Servlet如果要实现html的功能,必须使用writer输出对应的html比较麻烦,而jsp的情况是java和html可以组合成一个扩展名为jsp的文件,做界面展示比较方便而嵌入逻辑比较复杂
Java面试题21.内置对象和四大作用域和页面传值
9个内置的对象:
Requeset用户端请求,此请求会包含来自get/post请求的参数
Response网页传回用户端的回应
pageContext网页的属性是在这里管理
session与请求有关的会话期
application servlet正在执行的内容
out用来传送回应的输出
config servlet的架构部件
page jsp网页本身
exception针对错误网页,未捕获的列外
四大作用域:pageContext、request、session、application可以通过jstl从四大作用域中取值
Jsp传递值request、session、application、cookie也能传值
Java面试题22.Session和Cookie的区别和使用场景
单个cookie保存的数据不能超过4k,很多浏览器都限制一个站点最多保存20个cookie
Java面试题23.mvc模式和mvc各部分的实现
M(model)模型javabean
V(vierw)视图 html jsp volicity freemaker
C(control)控制器 servlet action
Jsp+servlet+javabean最经典mvc模式,实际上就是model2的实现方式,就是把视图和逻辑隔离开来
Model1的方式jsp+service+dao
Model2的方式jsp+service+service+dao
使用struts2和springmvc这样的mvc框架后,jsp+核心控制器+action+javabean
Java面试题24.数据库分类和常用数据库
Java面试题25.关系型数据库的三范式
Java面试题26.事务的四大特征
事务是并发控制的单位,是用户定义的一个操作系列,这些操作要么都做,要么都不做,是一个不可分割的工作单位。
比如:一个转账必须是A账号扣钱成功,B账号加钱成功,才算正真的转账成功。
事务必须满足四大特征:原子性,一致性,隔离线、持久性
原子性:表示事务内操作不可分割,要么都成功,要么都失败。
一致性:要么都成功,要么都失败,后面的失败了要对前面的操作进行回滚
隔离性:一个事务开始后,不能受其他事务干扰。
持久性:表示事务开始了就不能终止
Java面试题27.mysql数据库最大连接数
100
Java面试题28.mysql和oracle的分页语句
为什么需要分页?在很多数据是,不可能完全显示数据,进行分段显示,
Mysql是使用关键字limit来进行分页的limit offset,size 表示从多少索引去多少位
Oracle的分页,大部分情况下,我们是记不住了,说思路,要使用三层嵌套查询。
Oracle的分页有点儿记不住了,只记得一些大概,是使用了三层嵌套查询,如果在工作中使用了,可以到原来的项目中拷贝或上网查询
Java面试题29.触发器的使用场景?
Java面试题30.存储过程的优点
1、 存储过程只在创建时进行编译,以后每次执行存储过程都不需要再重新编译,而一般sql语句每执行一次就编译一次,因此使用存储过程可以大大提高数据库执行速度
2、 通常,复杂的业务逻辑需要多条sql语句,这些语句需要分别地从客户集发送到服务器,当客户机和服务器之间的网络传输就会大大减少,降低了网络负载。
3、 存储过程创建一次便可以重复使用,从而可以减少数据库开发人员的工作量,
4、 安全性高,存储过程可以屏蔽对底层数据库对象的直接访问,使用EXECUTE权限调用存储过程,无需拥有访问底层数据库对象的显示权限
Java面试题31.jdbc调用存储过程
Java面试题32.简单说一下你对jdbc的理解
Java database connection java数据库连接,数据库管理系统(mysql oracle等)是很多,每个数据库管理系统支持的命令是不一样的。
原因:1对于普通开发人员我们不知道mysql和oracle等数据库厂商的私有语言
2、就算你知道,因为每个数据库语句不同,你需要定制多套代码。
结论:
Java只定义接口,让数据库厂商自己实现接口,对于我们而言,只需要导入对应厂商开发的实现即可,然后以接口方式进行调用(mysql+mysql驱动(实现)+jdbc)
Java面试题33.写一个jdbc的访问oracle的列子
加载驱动(com.mysql.jdbc.Driver, oracle.jdbc.driver.OracleDriver)
获取连接(DriverManager.getConnection(url,username,password))
设置参数 statement preparedStatement (先获取)
Cstmt.setxxx(index,value);(设置)
执行 executeQuery(查询) executeupdate(更新)
释放连接(是否连接要从小到大,必须放到finnaly)
Java面试题34.jdbc中preparedStatement比Statement的好处
1、preparedStatement是预编译的,比statement速度快
2、代码的可读性和可维护性,preparedStatement比Statement好
3、preparedStatement可以防止sql注入攻击,而statement却不能,使用预编译语句你传入的任何内容就不会和原来的语句发生任何匹配的关系,只要全使用预编译语句你就用不着对传入的数据做任何过滤,而如果使用普通的statement,有可能要对drop等做费尽心机的判断和过滤
Java面试题35.数据库连接池的作用
Java面试题36.HTML
Java面试题37.简单介绍了一下Ajax
Java面试题38.js和JQuery的关系
Java面试题39.jQuery中的常用选择器
Java面试题40.jQuery中页面加载完毕事件
Java面试题41.jQuery中Ajax和原生js实现Ajax的关系
Java面试题42.简单说一下html5
Java面试题43.简单说一下css3
Java面试题44.bootstrap的是什么
Java面试题45.什么是框架
Java面试题46.简单介绍一下MVC模式
M(model)模型javabean
V(vierw)视图 html jsp volicity freemaker
C(control)控制器 servlet action
最简单的、最经典就是jsp(view)+servlet(controller)+javaBean(model)
1、 当控制器收到来自用户的请求
2、 控制器调用javabean完成业务
3、 完成业务后通过控制器跳jsp页面的方式给用户反馈信息
4、 Jsp个用户做出响应
控制器都是核心
Java面试题47.简单说一下对mvc框架的理解
是为了解决传统mvc模式(jsp+servlet+javaBean)问题而出现的框架
传统mvc模式问题
1、 所有的servlet和servlet映射都要配置在web.xml中,如果项目太大,web.xml就太庞大,并且不能实现模块化管理。
2、 Servlet的主要功能就是接受参数,调用逻辑、跳转页面、比如像其他字符编码、文件上传等功能也要写在servlet中,不能让servlet功能单一。
2.1接受参数比较麻烦,不能通过model接收,只能单个接收,接收完成后转换封装model
2.2跳转页面方式比较单一(forword,redirect),并且当我的页面名称发生改变是需要修改servlet源代码
Java面试题48.struts2的执行流程或者struts2的原理
Java面试题49.Struts2的拦截器是什么
Java里的拦截器是动态拦截Action调用的对象,它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码也可以在一个action执行前阻止其执行,同时也提供了一种可以提取action中可重用部分的方式。
在AOP中拦截器用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作
面试:
Struts2中的功能(参数处理、文件上传、字符编码等)都是通过系统拦截器实现的。如果业务需要,当然我们也可以自定义拦截器,进行可插拨配置,在执行Action的方法前后、加入相关逻辑完成业务
使用场景:
1、 用户登录判断、在执行Action的前面判断是否已经登录,如果没有登陆的跳转到登陆页面
2、 用户权限判断,在执行action的前面判断是否具有,如果没有权限就给出提示信息
3、 操作日志
Java面试题50.Spring MVC的执行流程
1、 用户向服务器发送请求,请求被spring前端控制servlet DispatcherServlet捕获
2、 DispatcherServlet对请求url进行解析,得到请求资源标识符(url),然后根据该url调用handlerMapping获得该handler配置的所有相关的对象(包括handler对象以及hander对象对应的拦截器),最后以handlerExecutionChain对象的形式返回:(查找handler)
3、 DispatcherServlet根据获得的handler,选择一个合适的handlerAdapter,提取request中的模型数据,填充handler入参,开始执行handler(controller),handler执行完成后,向DispatcherServlet返回一个modelAndView对象(执行handler)
4、 DispatcherServlet根据返回的modelAndView,选择一个适合的viewResolver(必须是已经注册到spring容器中的viewResolver)(选择viewrResolver)
5、 通过ViewResolver结合model和view,来渲染视图DispatccherServlet将渲染结果返回给客户端。(渲染返回)
记忆技巧:
核心控制器捕获请求、查找handler、执行handler、选择ViewResolver渲染视图并返回
Java面试题51.SpringMVC和Struts2的不同
1、 核心控制器(前端控制器、预处理控制器):对于使用过mvc框架的人来说这个词应该不会陌生,核心控制器的主要用途是处理所有的请求,然后对那些特殊的请求(控制器)统一的进行处理(字符编码、文体上传、参数接受、异常处理等等),spring mvc 核心控制器是servlet,而struts2是filter
2、 控制器实例:spring mvc会比struts快一些(理论上),spring mvc是基于方法设计,而struts是基于对象,每次发一次请求都会实例一个action,每个action都会被注入属性,而spring更像servlet一样,只有一个实例,每次请求执行对应的方法即可(注意:由于是单例实例,所以应当避免全局变量的修改,这样会产生线程安全问题)
3、 管理方式:大部分的公司的核心架构中,就会使用到spring,而spring mvc又是spring中的一个模块,所以spring对于spring mvc的控制器管理更加简单方便,而且提供了全注解方式进行管理,各种功能的注解都比较全面,使用简单,而struts2需要采用xml很多的配置参数来管理(虽然也可以采用注解,但是几乎没有公司那样使用)
4、 参数传递:struts2中自身提供多种参数接受,其实都是通过(valuestack值栈)进行传递和赋值,而spring mvc是通过方法的参数进行接收
5、 Intercepter的实现机制:struts有以自己的intercepter机制,spring mvc 用的是独立的AOP方式,这样导致struts的配置文件量还是比spring mvc大,虽然struts的配置能继承。 原因: Spring mvc是方法级别的拦截,一个方法对应一个request上下文,而方法同时又跟一个url对应,所以说从架构本身上spring mvc就容易实现restful url,struts2是类级别的拦截,一个类对应一个request上下文:实现restful url要费劲,因为struts2 action的一个方法可以对应一个url;而其类属性却被所有方法共享,这也就无法用注解或其他方式标识其所属方法了。Spring mvc的方法之间基本上独立的,独享request response数据,请求数据通过参数获取,处理结果通过modelmap交回给框架方法之间不共享变量,而struts2搞的比较乱,虽然方法之间也是独立的,但其所有Action变量是共享的,这不会影响程序运行,却给我们编码,读程序时带来麻烦
6、 Spring mvc处理ajax请求,直接通过返回数据,方法中使用注解@responseBody, spring mvc自动帮我们对象转换为json数据。而struts2是通过插件的方式进行处理
Java面试题52.简单介绍一下Spring或者Spring的两大核心
Spring是J2EE应用程序框架,是loc和AOP的容器框架,主要是针对JavaBean的生命周期进行管理的轻量级容器
1、IOC控制权反转:
原来:我的service需要调用dao,service就需要创建dao
Spring:spring发现你service依赖于dao,就给你注入
核心原理:就是配置文件+反射(工厂也可以)+容器(map)
2、 AOP:面向切面编程
核心原理:使用动态代理的设计模式在执行方法前后或出现异常做加入相关逻辑。
我们主要使用AOP来做:
1、 事务处理
2、 权限判断
3、 日志
Java面试题53.AOP是什么?都用它做什么?
核心原理:使用动态代理的设计模式在执行方法前后或出现异常做加入相关逻辑。
我们主要使用AOP来做:
1、 事务处理:执行方法前,开启事务、执行完成后关闭事务、出现异常后回滚事务
2、 权限判断:在执行方法前,判断是否具有权限
3、 日志 在执行前进行日志处理
Java面试题54.Spring事务的传播特性和隔离级别
传播特性:
Propagation
Required需要 如果存在一个事务,则支持当前事务。如果没有事务则开启
Supports 支持 如果存在一个事务,支持当前事务,如果没有事务,则非事务的执行
Mandatory必需的 如果已经存在一个事务,支持当前事务,如果没有一个活动的事务,则抛出异常
Required_new总是开启一个新的事务,如果一个事务已经存在,则将这个存在的事务挂起。
Not_support总是非事务地执行,并挂起任何存在的事务。
Never绝不 总是非事务地执行,如果存在一个活动事务,则抛出异常
Nested 嵌套的 如果有就嵌套,没有就开启事务
Java面试题55.ORM是什么?ORM框架是什么?
对象关系映射模式,是为了解决面向对象与关系数据库存在的互不匹配的现象的技术,通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。实现:一种简单的硬码方式(jdbc操作 sql方式),但需要为不同数据库提供单独的方法(不足)
另一种模式:采用映射元数据来描述对象关系的映射,也就是现在ORM框架Hibemate、mybatis、speedframework
Java面试题56.ibatis(mybatis)和hibernate有什么不同
相同点:
都是java中ORM框架、屏蔽jdbc api的底层访问细节,使用我们不用与jdbc api打交道,就可以完成对数据库的持久化操作。
Mybatis的好处:Mybatis是半自动的,它屏蔽jdbc api的底层访问细节,将sql语句与java代码进行分离;提供了将结果集自动封装称为实体对象和对象的集合的功能,queryforlist返回对象集合,用queryForObject返回单个对象:提供了自动将实体对象的属性传递给sql语句的参数
Hiber name的好处:hibernate是一个全自动的orm映射工具,它可以自动生成sql语句,并执行返回java结果。
不同点:
1、 hibernate要比mybatis功能强大很多,因为hibernate自动生成sql语句
2、 mybatis需要我们自己在xml配置文件中写sql语句,hibernate我们无法直接控制该语句,我们就无法去写特定的高效率的sql,对于一些不太复杂的sql查询,hibernate可以很好帮我们完成,但是,对于特别复杂的查询,hibernate就很难适应了。这时候用mybatis就是不错的选择,因为mybatis是由我们自己写sql语句,就可以处理复杂语句而hibernate不能。
3、 mybatis要比hibernate简单的多,mybatis是面向sql的,不同考虑对象间一些复杂的映射关系
Java面试题57.hibernate对象状态及其转换
Java面试题58:hibernate的缓存
一、为了提高访问速度,把磁盘或数据库访问变成内存访问
二、what(hibernate缓存原理是怎样的?)hibernate缓存包括两大类:hibernate一级缓存和hibernate二级缓存
面试:
Hibernate中的缓存分一级缓存和二级缓存
一级缓存就是 session级别的缓存,在事务范围内有效是内置的不能被卸载,二级缓存是sessionFactory级别的缓存,从应用启动到应用介绍有效果,是可选的,默认没有二级缓存,需要手动开启。
保存数据库后,在内存中保存一份,如果更新了数据库就要同步更新
什么样的数据适合存放到第二级缓存中?
1、 很少被修改的数据 帖子的最后回复时间
2、 经常被查询的数据 电商的地点
3、 不是很重要的数据,允许出现偶尔并发的数据
4、 不会被并发访问的数据
5、 常量数据
扩展:hibernate的二级缓存默认是不支持分布式缓存的,使用memcahe,redis等中央缓存来代替二级缓存
Java面试题59.webservice的使用场景
Webservice是一个面向服务的编程(SOA)的架构,它是不依赖于语言,不依赖于平台,可以实现不同的语言间的相互调用,通过internet进行基于http协议的网络应用间的交互
1、 异构系统的整合
2、 不同客户端的整合、浏览器、手机端、微信端、pc端等终端来访问
比如:天气预报,通过实现webservice客户端调用远程天气服务实现的
Java面试题60.activiti的简单介绍
Java面试题61.linux的使用场景
Java面试题62.linux常用命令
常用:
Pwd获取当前路径、 cd跳转到目录 、 su_u切换到管理员 Ls ls列举目录
文件操作命令:
文件 :tail查看 rm-rf vi
文件夹 mkdir rm-f
Java面试题63:怎么操作linux服务器
Java面试题64:有没有使用过云主机
Java面试题65:数据库优化方面的事情
查找、定位慢查询
优化手段:1创建索引 2分表:一张表的数据比较多或某些字段的值比较多但很少使用采用水平分表或者垂直分表 3.读写分离:当一台服务器不能满足需求时,采用读写分离方式进行集群 4缓存:使用redis进行缓存
Java面试题66:如果查询和定位慢查询
项目没有转测试之前,进行项目自验的时候,启动mysql数据库时启动慢查询,并且把执行慢的语句写到日志中,在运行一定时间后,通过查看日志找到慢查询语句。
使用explain慢查询语句,来详细分析语句的问题
Java面试题67:数据库优化之数据库表设计遵循范式
1、 原子性、即列的信息,不能分解,只要是关系型数据库,就自动满足
2、 表中的记录是唯一,即我们通常设计一个主键来实现
3、 表中的信息,如果能够推导出来,就不应该单独设计一个字段来存放(即外键)
Java面试题68:选择合适的数据库引擎
Myisam:如果表对事务要求不高,同时是以查询和添加为主的,比如:发帖表、回复表
INNODB:对事务要求高,保存的数据都是重要数据,我们建议使用innodb,比如订单表,账号表。
Memory:数据变化频繁,不需要入库,同时又频繁的查询和修改
问:myisam和innodb的区别
1、 事务安全myisam不支持事务而innodb支持
2、 查询和添加速度myisam不用支持事务就不用考虑同步锁,查找和添加的速度快
3、 支持全文索引myisam支持innodb不支持
4、 锁机制myisam支持表锁而innodb支持行锁(事务)
5、 外键myisam不支持外键,innodb支持外键(通常不设置外键,通常是在程序中保证数据的一致)
Java面试题69:选择合适的索引
索引是帮助DBMS高效获取数据的数据结构
分类:普通索引/唯一索引/主键索引/全文索引
普通索引:允许重复的值出现
唯一索引:除了不能有重复的记录外,其它和普通索引一样(用户名、用户身份证)
主键索引:是随着设定主键而创建的,也就是把某个列设为主键的时候,数据库就会给改列创建索引,这就是主键索引,唯一且没有null值
全文索引:用来对表中的文本域(char 、varchar、text)进行索引,全文索引针对myisam
Java面试题70:使用索引的一些技巧
索引弊端:
1、 占用磁盘空间
2、 对dml(插入、修改、删除)操作有影响,变慢
使用场景:
1、 肯定在where条件经常使用,如果不做查询就没有意义
2、 该字段的内容不是唯一的几个值(sex)
3、 字段内容不是频繁变化
具体技巧:
1、 对于创建的多列索引(复合索引),不是使用的第一部分就不会使用索引。
Alter table dept add index my_ind(dname,loc);//dname 左边的列,loc就是右边的列
Explain select*from dept where dname=”aaa”\G会使用到索引
Explain shlect*from dept where loc=”aaa”\G就不会使用到索引
2、 对于使用like的查询,查询如果是用前缀通配符‘%aa’不会使用到索引而‘aaa%’会使用索引列
Explain select*from dept where dname like”%aa”\G不能使用索引
Explain select*from dept where dname like”aaa%”\G 使用索引
所以在like查询时,‘关键字’的最前面不能使用%或者-这样的字符,如果一定要前面有变化的值,则考虑使用 全文检索》sphinx
3、 如果条件中有OR,有条件没有使用索引,即使其中有条件带索引也不会使用,换言之,就是要求使用的所有字段,都必须单独使用时能使用索引
4、 如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引 expain select*from dept where dname=’111’
5、 如果mysql估计使用全表扫描要比使用索引快,则不使用索引
Java面试题71:数据库优化之分表
水平分表(针对行较多)和垂直分表(针对列较多)
Java面试题72:数据库的读写分离
一台数据库支持的最大并发连接数是有限的,如果用户并发访问太多,一台服务器满足不了,就可以集群处理,mysql的集群处理技术最常用的就是读写分离:
主从同步
数据库最终会把数据持久到磁盘,如果集群必须确保每个数据库服务器的数据是一致的,改变数据库数据的操作都往主数据库去写,而其他的数据库从主数据库上同步数据
读写分离
使用负载均衡来实现写的操作都往主数据去,而读的操作往从服务器去
Java面试题73:数据库优化之缓存
在持久层(dao)和数据库(db)之间添加一个缓存层,如果用户访问的数据已经缓存起来时,在用户访问时直接从缓存中获取,不用访问数据库,而缓存是在操作内存级,访问速度快。
作用:减少数据库服务器压力,减少访问时间
Java中常用的缓存有
1、 hibernate的二级缓存,该缓存不能完成分布式缓存。可以使用redis来作为中央缓存
2、 可以使用redis来作为中央缓存,对缓存的数据进行集中处理
Java面试题74:sql语句优化小技巧
DDL优化:导入数据
1、 通过禁用索引来提供导入数据性能,这个操作主要针对有数据库的表,追加数据
//去除健
Alter table test3 DISABLE key;
//批量插入数据
Insert into test3 select*from test
//回复键
Alter table test3 ENABLE keys
2、 关闭唯一校验
Set unique_checks-o 关闭
Set unique_checks-1 开启
3、 修改事务提交方式(导入) 变多次提交为一次
Set autocommit-o 关闭
//批量插入
Set autocmmit-1开启
DML优化: 变多次提交为一次
Insert into test values(1,2);
Insert into test values(1,3);
Insert into test values(1,4);
//合并多条为一条
Insert into test values(1,3),(1,2),(1,4);
DQL优化
Order by优化
1、 多用索引排序
2、 普通结果排序(非索引排序)filesort
group by 优化
是使用order by null取消默认排序
子查询优化
在客户列表找到不在支付列表的客户
在客户列表找到不在“支付列表”的客户,查询没买过东西的客户
Explain
Select*from customer where customer_id not in(select DISTINCT customer_id from payment); 子查询 这种是基于func外链
Explain
Select*from customer c left join payment p on(c. customer_id=p. customer_id)where p. customer_id is null 这种是基于“索引”外链
Or优化
在两个独立索引上使用or的性能优于
1、 or两边都是用索引字段做判断,性能好!
2、 Or两边,有一边不用,性能差
3、 如果employee表的name和email这两列是一个复合索引,但是如果是:name=”“a”or email=”B” 这中方式,不会用到索引
Limit优化
Select film_id,description from film order by title limit 50.5;
Insert into test values
Java面试题75:批量插入几百万条数据
Java面试题76:有没有使用过redis
Java面试题77:redis的使用场景
缓存:
把经常需要查询的,很少修改数据,放到读速度很快的空间(内存),以便下次访问减少时间,减轻压力,减少访问时间。
计数器;
Redis中的计数器是原子性的内存操作
可以解决库存溢出问题,进销存,系统库存溢出
Session缓存服务器
Web集群是作为session缓存服务器
缓存队列等
Java面试题78:redis存储对象的方式
Json字符串:
需要把对象转换为json字符串,当做字符串处理,直接使用set get来设置
优点:设置和获取比较简单 缺点:没有提供专门的方法,需要把对象转换为json
字节:
需要做序列号,就是把对象序列化为字节保存
如果是担心json转对象会消耗资源的情况,这个问题需要考量几个地方
第一点, 就是使用的json转换lib是否就会存在性能问题
第二点, 就是数据的数据量级别,如果是存储百万级的大数据对象,建议采用存储序列化对象方式,如果是少量的数据级对象,或者是数据对象字段不多,还是建议采用json转换成string方式
毕竟redis对存储字符类型这部分优化的非常好,具体采用的方式与方法,还要看你所使用的场景
Java面试题79:redis数据淘汰机制
Volatile-lru;从已设置过期时间的数据集(server.db[i].expires)中挑选最近少使用的数据淘汰
Allkeys-lru;从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
Java面试题80:java访问redis级redis集群
java访问redis级:
1、 使用jedis java客户端来访问redis服务器,有点类似通过jdbc访问mysql一样
2、 当然如果是spring进行集成时,可以使用spring data组件来访问redis ,spring data只是对jedis的二次封装,jdbc Template jdbc关系一样
redis集群:当一台数据无法满足要求,可以使用redis集群来处理,类似于mysql的读写分离
Java面试题81:微信公众号分类和微信开发原理
Java面试题82:怎么把微信和业务平台进行绑定
Java面试题83:项目的分类和项目参与者
Java面试题84:项目流程和业务注意事项
shiro怎么使用的。
redis集群怎么使用的、哪些数据放在redis里面。
Quartz:存库预警的发送。
arraylist和linkedlist的区别。arraylist可以存null;
怎么创建多线程:继承Thread;实现Runnable;实现callable接口
springmvc实现原理。
poi导入导出。
webService怎么使用的。
mysql和Oracle怎么分页查询
Linux的一些简单命令
Hibernate和MyBatis有什么区别。
spring boot怎么使用的。
list和set、map会问。
数据算法,排序也会问。我说了快排、他就让我手写快排。然后我只把原理说给他听了。
设计模式、动态代理等。
标签:复合 pass 项目 这不 影响 访问 link jsp页面 model1
原文地址:https://www.cnblogs.com/yan562474129/p/9133279.html