赞
踩
MVC的全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,是一种软件设计典范。
MVC的优点:
1.耦合性低
2.重用性高
3.部署快,生命周期成本低
4.可维护性高
MVC的缺点:
1.完全理解MVC比较复杂。
2.调试困难。
3.不适合小型,中等规模的应用程序
4.增加系统结构和实现的复杂性
5.视图与控制器间的过于紧密的连接并且降低了视图对模型数据的访问
SSM框架是spring MVC ,spring和mybatis框架的整合,是标准的MVC模式,将整个系统划分为表现层,controller层,service层,DAO层四层
使用spring MVC负责请求的转发和视图管理
spring实现业务对象管理,mybatis作为数据对象的持久化引擎
ORM 对象关系映射 Object Relational Mapping
把持久化对象的保存、修改、删除等操作,转换成对数据库的操作
MyBatis 本来是apache的一个开源项目iBatis,然后改名为Mybatis。
MyBatis 是一款优秀的持久层框架,MyBatis的主要思想是将程序中的大量SQL语句抽出来,配置在文件中,以实现SQL的灵活配置
方法中的参数有多个时:
1.在映射文件中可以使用参数索引arg0,arg1…或者param1,param2…绑定参数
2.可以把多个参数组装成对象,在映射文件中#{属性名称}
3.可以把多个参数组装成map集合,在映射文件中#{map中的key值}
4.可以使用@Param注解进行参数绑定,在映射文件中用#{param注解中绑定的名称}
{}和美元{}的区别?
1.#{}在组装语句时,会替换成?
在进行?数值替换时,会在数据上自动添加’’
可以避免SQL注入
2.${}会把数值直接写在SQL语句中,数据上不会添加’’
不能避免SQL注入
resultType和resultMap的区别
当查到的数据和对象中的属性对应不上时,需要自定义映射规则,使用resultMap其他的时候使用resultType
当数据库中查询出来的数据和属性不对应时:
1.给sql语句中的字段起别名
2.自定义映射规则resultMap
Spring是一个开源框架,是为了解决企业应用程序开发复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许你选择使用哪一个组件,同时为J2EE应用程序开发提供继承的框架.简单来说,Spring是一个分层的JavaSE/EE full-stack(一站式)轻量级开源框架
Spring的核心
a)IoC:在IoC中是容器帮我们创建对象并注入依赖对象,正是容器帮我们查找和注入对象,对象是被获取,所以叫反转。
创建对象的三种方式:
1.根据类中无参构造方法创建对象
2.根据类中的静态工厂方法创建对象
通过静态方法来实例化一个对象,以后可以直接调用方法来实现
3.根据类中的实例化工厂方法创建对象
先创建类对象通过对象来调用创建实例对象的方法
对象的生命周期(单例模式下)
1.init-method初始化方法 在ClassPathXmlApplicationContext被初始化之后,被配置的bean对象也被初始化,然后放到map集合中
2.destroy-method销毁方法ClassPathXmlApplicationContext被销毁后,对应的map集合中的对象也会被销毁。注意,此时只针对单例模式的对象有效
3.如果scope设置成prototype,对象不是由ClassPathXmlApplicationContext来管理,生命周期也不会被管理
b)DI:依赖注入(给对象中的属性赋值),在spring中,a和b对象都是spring初始化并管理的,通过set方法注入或者constructor构造方法注入给b对象的引用
byName和byType:都是使用setter方法进行属性赋值
byName:根据属性名称匹配
在xml中找到和属性名称一样的bean对象,进行赋值
byType: 根据属性类型匹配
在xml中找到和属性类型一样的bean对象,进行赋值
四种注解类型:
@Component–表示一个自动扫描component 是其他三个的父类
@Repository–表示持久化层的DAO component
@Service–表示业务逻辑层的Service component
@Controller–表示表示层的Controller component
@Repository、@Service、@Controller三种注释是为了加强代码的阅读性而创造的,可以在不同的应用层中,用不同的注解
c)AoP:面向切面编程 Aspect-oriented programming通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术在不影响原来功能代码的基础上,使用动态代理加入自己需要的一些功能(比如权限的验证,事物的控制,日志的记录等),移除之后并不影响原来的功能面向切面编程是通过动态代理实现的,是面向对象思想的补充
面向切面编程(AoP)完善spring的依赖注入(DI),面向切面编程在spring中主要表现为两个方面
1.面向切面编程提供声明式事务管理
2.spring支持用户自定义的切面
面向切面编程(aop)是对面向对象编程(oop)的补充,
面向对象编程将程序分解成各个层次的对象,面向切面编程将程序运行过程分解成各个切面。
AOP从程序运行角度考虑程序的结构,提取业务处理过程的切面,oop是静态的抽象,aop是动态的抽象,
是对应用执行过程中的步骤进行抽象,,从而获得步骤之间的逻辑划分。
AOP的通知类型
before:在执行切入的方法之前,执行代码
after running:在执行切入的方法正常执行(没有异常之后)执行代码
after throwing:在执行切入的方法发生异常的时候,执行代码
after:在执行切入的方法无论是否发生异常,都必须最后执行代码
around:相当于before和after returning的组合
SpringMVC的工作原理
1、客户端发出一个http请求给web服务器,web服务器对http请求进行解析,如果匹配DispatcherServlet的请求映射路径(在web.xml中指定),web容器将请求转交给DispatcherServlet.
2、DipatcherServlet接收到这个请求之后将根据请求的信息(包括URL、Http方法、请求报文头和请求参数Cookie等)以及HandlerMapping的配置找到处理请求的处理器(Handler)。
3-4、DispatcherServlet根据HandlerMapping找到对应的Handler,将处理权交给Handler(Handler将具体的处理进行封装),再由具体的HandlerAdapter对Handler进行具体的调用。
5、Handler对数据处理完成以后将返回一个ModelAndView()对象给DispatcherServlet。
6、Handler返回的ModelAndView()只是一个逻辑视图并不是一个正式的视图,DispatcherSevlet通过ViewResolver将逻辑视图转化为真正的视图View。
7、Dispatcher通过model解析出ModelAndView()中的参数进行解析最终展现出完整的view并返回给客户端。
Controller中方法的返回值
1.返回值为ModelAndView类型
请求转发的方式实现跳转,界面路径会经过视图解析器进行解析
可以向下一个界面传递参数
2.返回值为String类型
路径直接写文件名,
界面会经过视图解析器进行解析,不可以向下一个界面传递参数
写有redirect:前缀
使用重定向请求,请求路径不会经过视图解析器
springmvc会自动添加上下文路径
写有forward:前缀
转发请求,请求路径不会经过视图解析器
3.没有返回值
如果需要界面跳转,需要写原生代码进行跳转
一般处理下载时会使用
方法中的参数:
1.请求的参数数据名称要和方法的参数名称保持一致
请求的参数数据名称和方法的参数名称不一样时需使用@RequestParam("")注解或@RequestParam(name=“password”,request=true)request=true则必须有参数数据,如果没有传递参数会报异常defaultValue设置参数的默认值
2.多个参数时,可以把参数组装成对象
请求的参数名称和对象的属性名称一致
spring 的优点?
1.降低了组件之间的耦合性 ,实现了软件各层之间的解耦
2.可以使用提供的众多服务,如事务管理,消息服务等
3.容器提供单例模式支持
4.容器提供了AOP技术,利用它很容易实现如权限拦截,运行期监控等功能
5.容器提供了众多的辅助类,能加快应用的开发
6.spring对于主流的应用框架提供了集成支持,如hibernate,JPA,Struts等
7.spring属于低侵入式设计,代码的污染极低
8.独立于各种应用服务器
9.spring的DI机制降低了业务对象替换的复杂性
10.Spring的高度开放性,并不强制应用完全依赖于Spring,开发者可以自由选择spring的部分或全部
分布式应用开发简单的说,是指将用户界面、控制台服务、数据库管理三个层次部署在不同的位置上。其中用户界面是客户端实现的功能,控制台服务是一个专门的服务器,数据管理是在一个专门的数据库服务器上实现的。
Spring Boot让我们的Spring应用变的更轻量化。Spring Boot可以让你更易上手,更简单快捷地构建Spring应用!
优点:
为所有Spring开发者更快的入门
开箱即用,提供各种默认配置来简化项目配置
内嵌式容器简化Web项目
没有冗余代码生成和XML配置的要求
缺点:
缺点是集成度较高,使用过程中不太容易了解底层。
Spring Cloud 基于 Spring Boot,为微服务体系开发中的架构问题,提供了一整套的解决方案——服务注册与发现,服务消费,服务保护与熔断,网关,分布式调用追踪,分布式配置管理等。
Spring Cloud 的优点:
1:约定优于配置
2:开箱即用、快速启动
3:适用于各种环境
4:轻量级的组件
5:组件支持丰富,功能齐全
spring cloud的组件:
(1)Spring Cloud Eureka(服务的注册与发现)构成Eureka体系的包括:服务注册中心、服务提供者、服务消费者
(2)Spring Cloud Feign(服务消费者(rest+ribbon))
(3)Spring Cloud Hystrix(断路器监控)
(4)Spring Cloud Config(分布式配置中心)
(5)Spring Cloud Zuul(路由网关)
(6)断路由
数据库分为:关系型数据库和非关系型数据库
关系型:mysql oracle sqlserver等
非关系型:redis,memcache,mogodb,hadoop等
请列举几种SQL优化的方法?
1:mysql所在服务器内核 优化;此优化可由系统运维人员完成
2:mysql配置参数优化(my.cnf);此优化需进行压力测试来进行参数调整
3:sql语句及表优化
①、当只要一行数据时使用 LIMIT 1
②、为搜索字段建索引
③、在Join表的时候使用相当类型的列,并将其索引
④、千万不要 ORDER BY RAND()
⑤、避免 SELECT *
⑥、永远为每张表设置一个ID
使用 ENUM 而不是 VARCHAR
⑧、尽可能的使用 NOT NULL
⑨、固定长度的表会更快
垂直分割
拆分大的 DELETE 或 INSERT 语句
越小的列会越快
左连接、右连接和内连接的区别是什么?
假设数据库中有A、B两张表
left join是以A表的记录为基础的,A可以看成左表,B可以看成右表,left join是以左表为准的.换句话说,左表(A)的记录将会全部表示出来,而右表(B)只会显示符合搜索条件的记录(例子中为: A.aID = B.bID).B表记录不足的地方均为NULL.
Right join以右表(B)为基础的,A表不足的地方用NULL填充.
inner join并不以谁为基础,它只显示符合条件的记录
group by 和having的区别用法
where:数据库中常用的是where关键字,用于在初始表中筛选查询。它是一个约束声明,用于约束数据,在返回结果集之前起作用。如下面这个例子,从user表中查询出userDepartmentId等于2的数据
select * from dbo.user where userDepartmentId=2
group by:对select查询出来的结果集按照某个字段或者表达式进行分组,获得一组组的集合,然后从每组中取出一个指定字段或者表达式的值。
在说group by的时候,我们还需要了解聚合函数,聚合函数是SQL语言中一种特殊的函数。例如:
count():获取数量
sum():求和(这里要注意求和是忽略null值的,null与其他数值相加结果为null,所以可以通过ifnull(xxx,0)将null的值赋为0)
avg():求平均数
max():求最大值
min():求最小值
这些函数和其它函数的根本区别就是它们一般作用在多条记录上。
我们需要注意的是:在使用group by的SQL语句中,select中返回的字段,必须满足以下两个条件之一:
1.包含在group by语句的后面,作为分组的依据;
2.这些字段包含在聚合函数中。
从刚才的那个例子中,我们查询出每个城市,相同年龄的员工数量:
select city, count(),age from dbo.user where departmentID=2 group by city,age
having:用于对where和group by查询出来的分组经行过滤,查出满足条件的分组结果。它是一个过滤声明,是在查询返回结果集以后对查询结果进行的过滤操作。
查一张表如果查的慢,如何解决
1、查询如果慢的建立索引可以提升速度
2、避免对索引字段进行计算或类型转化
3、表的设计尤为重要,避免使用LEFT JOIN 或 RIGHT JOIN去联表查询
4、查询字段时不要全部返回,忌讳使用*,最好是用什么字段返回什么字段,也可使得相关业务更加清晰
MySQL和Oracle的主要区别:
Oracle是Oracle公司推出的一款成熟的数据库产品是闭源同时也是收费的。
SQL语法的不同,MySQL较为灵活,Oracle较为严格(具体就是单引号,分页的处理,主键的自动增长)
对于事务的支持。MySQL对于事务默认是不支持的,只有某些存储引擎中如:innodb可以支持。而Oracle对于事务是完全支持,不管是OLTP还是OLAT都是支持的。
MySQL是单进程多线程,Oracle是多进程(在Windows下也是单进程)
数据库和实例以及用户之间的关系。
什么叫视图?游标是什么?
视图是一种虚拟的表,具有和物理表相同的功能。可以对视图进行增,改,查,操作,视图通常是有一个表或者多个表的行或列的子集。 游标:是对查询出来的结果集作为一个单元来有效的处理。游标可以定在该单元中的特定行,从结果集的当前行检索一行或多行。
触发器的作用?
触发器是一种特殊的存储过程,主要是通过事件来触发而被执行的。它可以强化约束,来维护数据的完整性和一致性,可以跟踪数据库内的操作从而不允许未经许可的更新和变化。可以联级运算。
启动后默认端口号 6379
Redis是为了解决在目前的互联网项目中经常面临的3个问题:
1.高并发2.高负载3.高可用
Redis有哪几种数据类型
字符串类型(String)
散列类型(hash)
列表类型(list)
集合类型(set)
有序集合类型(sorted set)
使用场景
缓存(数据查询,新闻,商品信息)(使用最多)
任务队列(秒杀,抢购)
分布式集群的 session分离
启动Redis服务/客户端
在 redis-4.0.1 中输入:src/redis-cli 命令启动 Redis 服务/客户端。
使用 ctrl + c 服务/关闭客户端。
缓存穿透:指查询一个一定不存在的数据,由于缓存是不命中时需要从数据库查询,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,造成缓存穿透。
解决方案:最简单粗暴的方法如果一个查询返回的数据为空(不管是数据不存在,还是系统故障),我们就把这个空结果进行缓存,但它的过期时间会很短,最长不超过五分钟。
缓存雪崩: 指在某一时间段内,缓存集中过期失效。
解决方案:缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。如果缓存数据库是分布式部署,将热点数据均匀分布在不同缓存数据库中。
缓存击穿:是指一个key非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像在一个屏障上凿开了一个洞。
解决方案:设置热点数据永远不过期。
------------------------------------------------------学习思想分割线--------------------------------------------------------------
.1、什么是主从复制、读写分离、为什么要使用
1.1.主从复制:是一种数据备份的方案。
简单来说,是使用两个或两个以上相同的数据库,将一个数据库当做主数据库,而另一个数据库当做从数据库。在主数据库中进行相应操作时,从数据库记录下所有主数据库的操作,使其二者一模一样。
1.2.读写分离:是一种让数据库更稳定的的使用数据库的方法。
是在有从数据库的情况下使用,当主数据库进行对数据的增删改也就是写操作时,将查询的任务交给从数据库。
1.3.为什么要使用主从分离和读写操作呢?
主从复制:1、当主数据库出现问题时,可以当从数据库代替主数据库,可以避免数据的丢失。
2、可以进行读写分离
读写分离:1、避免从数据库进行写操作而导致的主从数据库数据不一致的情况,因为当主从数据库数据不一致时,那么从数据库最主要的备份任务就没有意义了。
2、减轻主数据库的压力。因为进行写操作更耗时,所以如果不进行读写分离的话,写操作将会影响到读操作的效率。
2、什么是集群
如果说主从复制是各司其职的话,那么集群就是一群同样的个体做着同样的事情。在Redis中,数据的写入操作次数很大的情况下,只使用单独一个服务器来进行写入操作的话,效率不高,那么如果使用集群方案,利用多个Redis服务器来进行写操作,大量的数据,你写一点,我写一点,大家都分担一点,那么效率会高很多。就像一小块土地需要挖土,那么一台挖掘机就足够,但是遇上了一大片土地,虽然一台挖掘机也能够完成任务,但是需要很久很久,那么我现在再找个十台挖掘机一起挖土,那么效率就会高很多了。
集群模式的思想可以在多处使用。总之就是,一个个体完成不了或者说效率很低的场景下,都可以使用这种思想。
就如下面将要说到的哨兵,一个哨兵监视一个服务器集群肯定是不够的,那么就需要一个哨兵集群来监视。
3、什么是哨兵模式
是一种容灾方案。
哨兵:实则是一个在特殊模式下的Redis服务器,里面存储的是自己本身的信息,主服务器的信息,从服务器的信息。
用一个或者多个哨兵来监视主服务器(也就是进行写操作的服务器)是否在正常执行任务,一旦哨兵发现主服务器不可用时,就找到一个合适的从服务器成为主服务器。
4、为什么要用Redis数据库
Redis数据库是NOSQL数据库中以key-value存储模式下的一种数据库。
那么NOSQL又是什么数据库呢?非关系型数据库。
什么要使用Nosql?
1) 当数据量的总大小一个机器放不下时。
2) 数据索引一个机器的内存放不下时。
3) 访问量(读写混合)一个实例放不下时。
在信息爆炸的今天,数据的存储,对数据的查询都是非常频繁且非常大量的。关系型数据库的就显得力不从心了,扩展性较差,查询简单条件数据的效率较低等缺点,无意是致命的。而NOSQL数据库中的数据之间并无关系,这一特点造就了NOSQL的易扩展性,读写性能高等优势。所以面对大量的数据读写,非关系型数据库相比较于关系型数据库有着巨大的优势。
那么Redis数据库为什么又在NOSQL中脱颖而出?
我认为是有以下几个原因,
1、Redis支持多种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。可以在大部分的场景中使用。
2、支持主从复制,读写分离。读写效率大大提升。
3、数据存储在内存中,可用来做缓存。需要持久化的数据就将其存入硬盘,不需要持久化的数据,可以进行短暂的存储,提高访问速度。
Tomcat服务器优化(内存,并发连接数,缓存)
a) 内存优化:主要是对Tomcat启动参数进行优化,我们可以在Tomcat启动脚本中修改它的最大内存数等等。
b) 线程数优化:Tomcat的并发连接参数,主要在Tomcat配置文件中server.xml中配置,比如修改最小空闲连接线程数,用于提高系统处理性能等等。
c) 优化缓存:打开压缩功能,修改参数,比如压缩的输出内容大小默认为2KB,可以适当的修改。
其特点是占有内存少,并发能力强。
功能:
静态HTTP服务器
Nginx是一个HTTP服务器,可以将服务器上的静态文件(如HTML、图片)通过HTTP协议展现给客户端。
反向代理服务器
客户端本来可以直接通过HTTP协议访问某网站应用服务器,网站管理员可以在中间加上一个Nginx,客户端请求Nginx,Nginx请求应用服务器,然后将结果返回给客户端,此时Nginx就是反向代理服务器。
负载均衡
将同一个应用部署在多台服务器上,将大量用户的请求分配给多台机器处理。同时带来的好处是,其中一台服务器万一挂了,只要还有其他服务器正常运行,就不会影响用户使用。
Nginx可以通过反向代理来实现负载均衡。
虚拟主机
将多个网站部署在同一台服务器上,多个域名解析到同一个IP地址,但是用户通过多个域名却可以打开多个完全不同的网站,互相不影响,就像访问多个服务器一样
nginx支持的负载均衡调度算法
1、轮询(默认)每个请求按时间顺序逐一分配到不同的后端服务,如果后端某台服务器死机,自动剔除故障系统,使用户访问不受影响。
2、weight(轮询权值)weight的值越大分配到的访问概率越高,主要用于后端每台服务器性能不均衡的情况下。或者仅仅为在主从的情况下设置不同的权值,达到合理有效的地利用主机资源。
3、ip_hash每个请求按访问IP的哈希结果分配,使来自同一个IP的访客固定访问一台后端服务器,并且可以有效解决动态网页存在的session共享问题。
4、fair比 weight、ip_hash更加智能的负载均衡算法,fair算法可以根据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间 来分配请求,响应时间短的优先分配。Nginx本身不支持fair,如果需要这种调度算法,则必须安装upstream_fair模块。
5、url_hash按访问的URL的哈希结果来分配请求,使每个URL定向到一台后端服务器,可以进一步提高后端缓存服务器的效率。Nginx本身不支持url_hash,如果需要这种调度算法,则必须安装Nginx的hash软件包。
AJAX 最大的优点是在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容。
Ajax的工作原理相当于在用户和服务器之间加了—个中间层(AJAX引擎),使用户操作与服务器响应异步化。并不是所有的用户请求都提交给服务器,像—些数据验证和数据处理等都交给Ajax引擎自己来做, 只有确定需要从服务器读取新数据时再由Ajax引擎代为向服务器提交请求
ajax的工作流程是什么
1.客户端产生js的事件
2.创建XMLHttpRequest对象
3.对XMLHttpRequest进行配置
4.通过AJAX引擎发送异步请求
5.服务器端接收请求并且处理请求,返回html或者xml内容
6.XML调用一个callback()处理响应回来的内容
7.页面局部刷新,
Ajax中常用的name数据:
async 布尔值,表示请求是否异步处理。默认是 true。
同步请求:发起请求之后,只能等待请求结束之后,才能做其他操作
异步请求:发起请求之后,不需要等待请求结束,就可以进行其他操作
url 规定发送请求的 URL。默认是当前页面。
type 规定请求的类型(GET 或 POST)。
data 规定要发送到服务器的数据。参数数据
dataType 预期的服务器响应的数据类型。
timeout 设置本地的请求超时时间(以毫秒计)。
success(result,status,xhr) 当请求成功时运行的函数。
error(xhr,status,error) 如果请求失败要运行的函数。
complete(xhr,status) 请求完成时运行的函数(在请求成功或失败之后均调用,即在 success 和 error 函数之后)。
进程(Process):
独占资源的程序执行单位,每个独立运行的程序都对应一个进程,进程指正在运行的程序。确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能。
线程(Thread):
线程是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程。一个进程中是可以有多个线程的,这个应用程序也可以称之为多线程程序。
二者区别
一个程序运行后至少有一个进程,一个进程中可以包含多个线程
有三种方式可以用来创建线程:
继承Thread类
实现Runnable接口
应用程序可以使用Executor框架来创建线程池
实现Runnable接口这种方式更受欢迎,因为这不需要继承Thread类。在应用设计中已经继承了别的对象的情况下,这需要多继承(而Java不支持多继承),只能实现接口。同时,线程池也是非常高效的,很容易实现和使用。
什么是死锁(deadlock)?
死锁概念及产生原理
概念:多个并发进程因争夺系统资源而产生相互等待的现象。
原理:当一组进程中的每个进程都在等待某个事件发生,而只有这组进程中的其他进程才能触发该事件,这就称这组进程发生了死锁。
本质原因:
1)、系统资源有限。
2)、进程推进顺序不合理。
如何确保N个线程可以访问N个资源同时又不导致死锁?
使用多线程的时候,一种非常简单的避免死锁的方式就是:指定获取锁的顺序,并强制线程按照指定的顺序获取锁。因此,如果所有的线程都是以同样的顺序加锁和释放锁,就不会出现死锁了。
死锁产生的4个必要条件(全部满足才会造成死锁)
1、互斥:某种资源一次只允许一个进程访问,即该资源一旦分配给某个进程,其他进程就不能再访问,直到该进程访问结束。
2、占有且等待:一个进程本身占有资源(一种或多种),同时还有资源未得到满足,正在等待其他进程释放该资源。
3、不可抢占:别人已经占有了某项资源,你不能因为自己也需要该资源,就去把别人的资源抢过来。
4、循环等待:存在一个进程链,使得每个进程都占有下一个进程所需的至少一种资源。
避免死锁的方法
1、死锁预防 ----- 确保系统永远不会进入死锁状态
产生死锁需要四个条件,那么,只要这四个条件中至少有一个条件得不到满足,就不可能发生死锁了。由于互斥条件是非共享资源所必须的,不仅不能改变,还应加以保证,所以,主要是破坏产生死锁的其他三个条件。
A、破坏“占有且等待”条件
B、破坏“不可抢占”条件
C、破坏“循环等待”条件
2、避免死锁 ----- 在使用前进行判断,只允许不会产生死锁的进程申请资源
死锁避免是利用额外的检验信息,在分配资源时判断是否会出现死锁,只在不会出现死锁的情况下才分配资源。
两种避免办法:
1、如果一个进程的请求会导致死锁,则不启动该进程
2、如果一个进程的增加资源请求会导致死锁 ,则拒绝该申请。
避免死锁的具体实现通常利用银行家算法
死锁避免的优点:
不需要死锁预防中的抢占和重新运行进程,并且比死锁预防的限制要少。
死锁避免的限制:
必须事先声明每个进程请求的最大资源量
考虑的进程必须无关的,也就是说,它们执行的顺序必须没有任何同步要求的限制
分配的资源数目必须是固定的。
在占有资源时,进程不能退出
死锁的解除
1、抢占资源:从一个或多个进程中抢占足够数量的资源分配给死锁进程,以解除死锁状态。
2、终止(或撤销)进程:终止或撤销系统中的一个或多个死锁进程,直至打破死锁状态。
a、终止所有的死锁进程。这种方式简单粗暴,但是代价很大,很有可能会导致一些已经运行了很久的进程前功尽弃。
b、逐个终止进程,直至死锁状态解除。该方法的代价也很大,因为每终止一个进程就需要使用死锁检测来检测系统当前是否处于死锁状态。
线程调度的两种方式
线程调度是指按照特定机制为多个线程分配CPU的使用权.
分时调度
所有线程轮流使用 CPU 的使用权,平均分配每个线程占用 CPU 的时间。
抢占式调度
优先让优先级高的线程使用 CPU,如果线程的优先级相同,那么会随机选择一个(线程随机性),java虚拟机采用抢占式调度模型。
线程生命周期
即线程在JVM中运行经历的过程,经历五个阶段:创建、就绪、运行、阻塞、终止。
Sleep() 和wait() 有什么区别?
sleep 是线程类(Thread)的方法,导致此线程暂停执行指定时间,把执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep 不会释放对象锁。wait 是Object 类的方法,对此对象调用wait 方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify 方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。
什么是线程池
线程池 ,其实就是一个容纳多个线程的容器,其中的线程可以反复使用,省去了频繁创建线程对象的操作,无需反复创建线程而消耗过多资源。
Sleep() 和wait() 有什么区别?
sleep 是线程类(Thread)的方法,导致此线程暂停执行指定时间,把执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep 不会释放对象锁。wait 是Object 类的方法,对此对象调用wait 方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify 方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。
什么是泛型?为什么要使用泛型?
泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。参数化类型就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参)。
泛型的本质是为了参数化类型(在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型)。也就是说在泛型使用过程中,
操作的数据类型被指定为一个参数,这种参数类型可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法。
Java 泛型的参数只可以代表类,不能代表个别对象。由于 Java 泛型的类型参数之实际类型在编译时会被消除,所以无法在运行时得知其类型参数的类型。Java 编译器在编译泛型时会自动加入类型转换的编码,故运行速度不会因为使用泛型而加快。Java 允许对个别泛型的类型参数进行约束,包括以下两种形式(假设 T 是泛型的类型参数,C 是一般类、泛类,或是泛型的类型参数):T 实现接口 I 。T 是 C ,或继承自 C 。一个泛型类不能实现Throwable接口。
集合与数组及字符串缓冲区的区别:字符串缓冲区的内存中只能存储字符串
数组和集合的区别:
1)长度区别:
数组长度固定
集合长度可变
2)内容的区别
数组可以存储同一种类型的元素
集合可以存储多种类型的元素
3)存储类型的区别
数组:可以存储基本类型,也可以存储引用类型
集合:只能存储引用类型
List、set、map的区别是什么
Collection集合有两个子集合List和set
HashMap和Hashtable都是Map接口的典型实现类
List:
1.list集合中的数据能重复(重复输出)
2.有顺序(存进去和取出来的顺序一样)
3.有索引
Set:
1.set集合中的数据不能重复(重复不输出)
2.没有顺序(存进去和取出来的顺序不一样)
3.没有索引
Map:(容器类)以键值对的形式存放数据
1.map中key值不能重复,重复时数据会进行覆盖
2.Map中数据是无序的
3.没有索引
ArrayList和LinkedList有什么区别?
ArrayList和LinkedList都实现了List接口,他们有以下的不同点:
ArrayList是基于索引的数据接口,它的底层是数组。它可以以O(1)时间复杂度对元素进行随机访问。与此对应,LinkedList是以元素列表的形式存储它的数据,每一个元素都和它的前一个和后一个元素链接在一起,在这种情况下,查找某个元素的时间复杂度是O(n)。
相对于ArrayList,LinkedList的插入,添加,删除操作速度更快,查找时速度慢。因为当元素被添加到集合任意位置的时候,不需要像数组那样重新计算大小或者是更新索引。
LinkedList比ArrayList更占内存,因为LinkedList为每一个节点存储了两个引用,一个指向前一个元素,一个指向下一个元素。
HashMap和Hashtable有什么区别?
HashMap和Hashtable都是实现了Map接口,因此很多特性非常相似。但是,他们有以下不同点:
HashMap允许键和值是null,而Hashtable不允许键或者值是null。
Hashtable是同步的,而HashMap不是。因此,HashMap更适合于单线程环境,而Hashtable适合于多线程环境。
HashMap提供了可供应用迭代的键的集合,因此,HashMap是快速失败的。另一方面,Hashtable提供了对键的列举(Enumeration)。
一般认为Hashtable是一个遗留的类。
什么是流,按照传输的单位,分成哪两种流
字节流:InputStream OutputStream
字符流:Reader Writer
什么是比特(Bit),什么是字节(Byte),什么是字符(Char),它们长度是多少,各有什么区别
Bit最小的二进制单位 ,是计算机的操作部分 取值0或者1
Byte是计算机操作数据的最小单位由8位bit组成 取值(-128-127)
Char是用户的可读写的最小单位,在Java里面由16位bit组成 取值(0-65535)
什么叫对象序列化,什么是反序列化,实现对象序列化需要做哪些工作
对象序列化,将对象以二进制的形式保存在硬盘上
反序列化;将二进制的文件转化为对象读取
实现serializable接口(不想让字段放在硬盘上就加transient)
优点如下:
简化了项目依赖管理:
易于上手,对于新手可能一个"mvn clean package"命令就可能满足他的工作
便于与持续集成工具(jenkins)整合
便于项目升级,无论是项目本身升级还是项目使用的依赖升级。
有助于多模块项目的开发,一个模块开发好后,发布到仓库,依赖该模块时可以直接从仓库更新,而不用自己去编译。
maven有很多插件,便于功能扩展,比如生产站点,自动发布版本等
缺点如下:
maven是一个庞大的构建系统,学习难度大
maven采用约定优于配置的策略(convention over configuration),虽然上手容易,但是一旦出了问题,难于调试。
当依赖很多时,m2eclipse 老是搞得Eclipse很卡。
中国的网络环境差,很多repository无法访问,比如google code, jboss 仓库无法访问等。
Maven常用命令:
mvn –version/mvn -v显示maven安装版本信息
mvn clean清理项目打包文件,即项目下的target目录
mvn compile编译项目下的src/main/Java目录源代码
mvn package项目打包,在项目target目录下生成编译后的jar或war等文件
mvn install项目打包并发布到本地仓库
mvn deploy项目打包并发布到远程仓库
mvn test单元测试命令,执行src/test/java/下的junit的单元测试用例
mvn site生成项目相关信息的网站
m:eclipse将项目转化evn eclipseclipse项目
mvn dependency:tree打印出项目的整个依赖关系树
mvn archetype:generate创建一个maven普通java项目
mvn tomcat:run在tomcat容器中运行web应用,需要在pom文件中配置tomcat插件
mvn jetty:run在jetty容器中运行web应用,需要在pom文件中配置jetty插件
① SQL语句及索引的优化
② 数据库表结构的优化
③ 系统配置的优化
④ 硬件的优化
1.对属性的原子性约束,要求属性具有原子性,不可再分解;
2.对记录的惟一性约束,要求记录有惟一标识,即实体的惟一性;
3.对字段冗余性的约束,即任何字段不能由其他字段派生出来,它要求字段没有冗余。
① 以“%”开头的LIKE语句,模糊匹配
② OR语句前后没有同时使用索引
③ 数据类型出现隐式转化(如varchar不加单引号的话可能会自动转换为int型)
http 和https
HTTPS和HTTP的区别:
https协议需要到ca申请证书,一般免费证书很少,需要交费。
http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议。
http和https使用的是完全不同的连接方式用的端口也不一样,前者是80,后者是443。
http的连接很简单,是无状态的。
HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议 要比http协议安全。
1.什么是事务
一件事情有n个组成单元 要不这n个组成单元同时成功 要不n个单元就同时失败就是将n个组成单元放到一个事务中。
通俗来说,就是 逻辑上的一组操作,要么同时成功,要么同时失败。这样就明白了了吧。
2.事务的特性
1)原子性(Atomicity)原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
2)一致性(Consistency)一个事务中,事务前后数据的完整性必须保持一致。
3)隔离性(Isolation)多个事务,事务的隔离性是指多个用户并发访问数据库时, 一个用户的事务不能被其它用户的事务所干扰,多个并发事务之间数据要相互隔离。
4)持久性(Durability)持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。
3.隔离级别
1)read uncommitted : 读取尚未提交的数据 :哪个问题都不能解决
2)read committed:读取已经提交的数据 :可以解决脏读 ---- oracle默认的
3)repeatable read:重读读取:可以解决脏读 和 不可重复读 —mysql默认的
4)serializable:串行化:可以解决 脏读 不可重复读 和 虚读—相当于锁表
4.事务的7种传播级别:
为了通俗易懂,笔者就不用字来讲解了,直接上图。
CAS框架:CAS(Central Authentication Service)是基于Kerberos票据方式实现SSO单点登录的框架。首次登陆详解1)浏览器首次访问系统A,CASFilter截获请求,A获取不到JSessionID发现未登录,系统A将浏览器重定向到认证中心;2)认证中心获取全局票据,未获取到,认定用户未登录给用户跳转到登录页进行登录。认证成功之后给浏览器生成一个全局票据(一般存放在cookie中称之为TGC–Ticket Granting Cookie,出于安全考虑TGC经过加密并且有时效性,关闭浏览器会自动过期),然后重定向到系统A并且附上临时票据(Service Ticket由认证中心随机生成并发放给用户的身份标志是一种一次性信任凭证);3)系统A的CASFilter截获请求,获取临时票据,获取到之后将临时票据传给认证中心确认(票据由认证中心生成,几乎不可伪造,标志用户身份)。认证中心通过认证之后将用户信息返回给系统A,系统A将浏览器请求授权资源返回;4.已登录状态访问系统B详解1)浏览器访问系统B,CASFilter截获请求,系统B获取JSessionID,未获取到,重定向至认证中心;2)认证中心获取全局票据,获取到之后认定用户已经登录,认证中心发放系统B的临时票据,并重定向至系统B;3)系统B获取临时票据,获取到之后将临时票据传给认证中心确认,认证中心通过认证之后将用户信息返回给系统B,系统B将浏览器请求资源返回;
什么是docker?
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口
为什么使用docker?
swagger是什么?
1、是一款让你更好的书写API文档的规范且完整框架。
2、提供描述、生产、消费和可视化RESTful Web Service。
3、是由庞大工具集合支撑的形式化规范。这个集合涵盖了从终端用户接口、底层代码库到 商业API管理的方方面面。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。