话不多少直接上干货
1.什么是Maven?
Maven使用项目对象模型(POM)的概念,可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具。
Maven 除了以程序构建能力为特色之外,还提供高级项目管理工具。由于 Maven 的缺省构建规则有较高的可重用性,所以常常用两三行 Maven 构建脚本就可以构建简单的项目。由于 Maven 的面向项目的方法,许多 Apache Jakarta 项目发布时使用 Maven,而且公司项目采用 Maven 的比例在持续增长。
Maven的出现,解决了开发过程中的jar包升级及依赖的难题。它可以对项目依赖的jar包进行管理,可以让你的项目保持基本的依赖,排除冗余jar包,并且可以让你非常轻松的对依赖的jar包进行版本升级。而这些仅仅是Maven最基本的功能,它可以在这基础上对项目进行清理、编译、测试、打包、发布等等构建项目的工作。
可以说,Maven是现在Java社区中最强大的项目管理和项目构建工具,而更加值得庆幸的是,这样一个强大的工具,它的使用也是非常简单的。
现在,JavaEE项目使用的开源软件都可以通过Maven来获取,并且,越来越多的公司也开始使用Maven来管理构建项目了。
2.Maven和ANT的区别
1.maven&ant同属apach是流行的构建工具。
都是为了简化软件开发而存在的。但是maven因为自身管理一个项目对象模型(project object model),这个模型其实就是抽象了一个项目的开发流程,它包含了一个项目的生命周期的各个阶段,并将这个周期固定下来,这也就是约定大于配置。约定大于配置的意思就是,我maven将项目开发的各个阶段固定起来了,每个文件的存放位置,每个阶段要生成什么文件、保存为什么格式并且要把它放在什么位置,我都固定好了。我知道一个软件是怎么开发出来,如果一个项目要使用maven,可以,但你要遵循我的规则,文件目录不要乱建乱放,只有这样maven才会将源码用起来。这就是约定大于配置,因为maven已经将流程固定下来了,只要遵守约定,就不需要自己手动去配置了,这将大大地提高开发效率。就像是开车一样,只要知道点火、油门、方向、刹车,就可以将车子开东起来(当然出于安全和法律考虑,还是要考驾照的。),关于车子内部的传动原理,电气原理,工程原理,普通人并不需要了解多少,日常够用就好了。这也是约定大于配置的一个例子。配置就是自己造一辆车去开,有必要,有能力,有时间吗?
2.maven的中央仓库和pom.xml文件。中央仓库统一存放了开发用到的各种jar包,要用时只需要添加依赖到pom文件中,maven就会自动下载,当然为了方便一般会在本地建一个仓库,减少下载时间。pom文件是maven的配置文件,maven就是通过管理pom文件和一些核心插件来管理项目。当然我前面将maven拟人化了,其实maven是没有智力的,一切都是封装好的流程,只是maven将很多操作隐藏起来了。
3.ant的build.xml文件。build文件是ant的配置文件,ant依靠它来执行操作,与maven不同的是ant没有固定一条程序链。你想要执行什么操作以及操作之间的顺序和依赖关系,都需要手动添加到build文件中,一点一滴都要写清楚,否则ant就不会执行。
4.maven和ant区别
Maven 拥有约定,只要遵守约定,它就知道你的源代码在哪里。Maven 是声明式的。你需要做的只是创建一个 pom.xml 文件然后将源代码放到默认的目录。Maven 会帮你处理其它的事情。Maven 有一个生命周期,当你运行 mvn install 的时候被调用。这条命令告诉 Maven 执行一系列的有序的步骤,直到到达你指定的生命周期。缺点是运行许多默认目标。
而ant没有约定,项目生命周期,它是命令式的。所有操作都要手动去创建、布置。甚至连build.xml文件都需要手动创建。
3.Maven仓库是什么
Maven仓库是基于简单文件系统存储的,集中化管理Java API资源(构件)的一个服务。仓库中的任何一个构件都有其唯一的坐标,根据这个坐标可以定义其在仓库中的唯一存储路径。得益于 Maven 的坐标机制,任何 Maven项目使用任何一个构件的方式都是完全相同的,Maven 可以在某个位置统一存储所有的 Maven 项目共享的构件,这个统一的位置就是仓库,项目构建完毕后生成的构件也可以安装或者部署到仓库中,供其它项目使用。
对于Maven来说,仓库分为两类:本地仓库和远程仓库。
4.Maven的工程类型有哪些?
POM工程
POM工程是逻辑工程。用在父级工程或聚合工程中。用来做jar包的版本控制。
JAR工程
将会打包成jar用作jar包使用。即常见的本地工程 – Java Project。
WAR工程
将会打包成war,发布在服务器上的工程。如网站或服务。即常见的网络工程 – Dynamic Web Project。war工程默认没有WEB-INF目录及web.xml配置文件,IDE通常会显示工程错误,提供完整工程结构可以解决。
5.Maven常用命令有哪些?
install
本地安装, 包含编译,打包,安装到本地仓库
编译 – javac
打包 – jar, 将java代码打包为jar文件
安装到本地仓库 – 将打包的jar文件,保存到本地仓库目录中。
clean
清除已编译信息。
删除工程中的target目录。
compile
只编译。 javac命令
deploy
部署。 常见于结合私服使用的命令。
相当于是install+上传jar到私服。
包含编译,打包,安装到本地仓库,上传到私服仓库。
package
打包。 包含编译,打包两个功能。
6.ZooKeeper的作用是什么?
配置管理
在我们的应用中除了代码外,还有一些就是各种配置。比如数据库连接等。一般我们都是使用配置文件的方式,在代码中引入这些配置文件。当我们只有一种配置,只有一台服务器,并且不经常修改的时候,使用配置文件是一个很好的做法,但是如果我们配置非常多,有很多服务器都需要这个配置,这时使用配置文件就不是个好主意了。这个时候往往需要寻找一种集中管理配置的方法,我们在这个集中的地方修改了配置,所有对这个配置感兴趣的都可以获得变更。Zookeeper就是这种服务,它使用Zab这种一致性协议来提供一致性。现在有很多开源项目使用Zookeeper来维护配置,比如在HBase中,客户端就是连接一个Zookeeper,获得必要的HBase集群的配置信息,然后才可以进一步操作。还有在开源的消息队列Kafka中,也使用Zookeeper来维护broker的信息。在Alibaba开源的SOA框架Dubbo中也广泛的使用Zookeeper管理一些配置来实现服务治理。
名字服务
名字服务这个就很好理解了。比如为了通过网络访问一个系统,我们得知道对方的IP地址,但是IP地址对人非常不友好,这个时候我们就需要使用域名来访问。但是计算机是不能是域名的。怎么办呢?如果我们每台机器里都备有一份域名到IP地址的映射,这个倒是能解决一部分问题,但是如果域名对应的IP发生变化了又该怎么办呢?于是我们有了DNS这个东西。我们只需要访问一个大家熟知的(known)的点,它就会告诉你这个域名对应的IP是什么。在我们的应用中也会存在很多这类问题,特别是在我们的服务特别多的时候,如果我们在本地保存服务的地址的时候将非常不方便,但是如果我们只需要访问一个大家都熟知的访问点,这里提供统一的入口,那么维护起来将方便得多了。
分布式锁
其实在第一篇文章中已经介绍了Zookeeper是一个分布式协调服务。这样我们就可以利用Zookeeper来协调多个分布式进程之间的活动。比如在一个分布式环境中,为了提高可靠性,我们的集群的每台服务器上都部署着同样的服务。但是,一件事情如果集群中的每个服务器都进行的话,那相互之间就要协调,编程起来将非常复杂。而如果我们只让一个服务进行操作,那又存在单点。通常还有一种做法就是使用分布式锁,在某个时刻只让一个服务去干活,当这台服务出问题的时候锁释放,立即fail over到另外的服务。这在很多分布式系统中都是这么做,这种设计有一个更好听的名字叫Leader Election(leader选举)。比如HBase的Master就是采用这种机制。但要注意的是分布式锁跟同一个进程的锁还是有区别的,所以使用的时候要比同一个进程里的锁更谨慎的使用。
集群管理
在分布式的集群中,经常会由于各种原因,比如硬件故障,软件故障,网络问题,有些节点会进进出出。有新的节点加入进来,也有老的节点退出集群。这个时候,集群中其他机器需要感知到这种变化,然后根据这种变化做出对应的决策。比如我们是一个分布式存储系统,有一个中央控制节点负责存储的分配,当有新的存储进来的时候我们要根据现在集群目前的状态来分配存储节点。这个时候我们就需要动态感知到集群目前的状态。还有,比如一个分布式的SOA架构中,服务是一个集群提供的,当消费者访问某个服务时,就需要采用某种机制发现现在有哪些节点可以提供该服务(这也称之为服务发现,比如Alibaba开源的SOA框架Dubbo就采用了Zookeeper作为服务发现的底层机制)。还有开源的Kafka队列就采用了Zookeeper作为Cosnumer的上下线管理。
7.什么是Znode?
在Zookeeper中,znode是一个跟Unix文件系统路径相似的节点,可以往这个节点存储或获取数据。
Zookeeper底层是一套数据结构。这个存储结构是一个树形结构,其上的每一个节点,我们称之为“znode”
zookeeper中的数据是按照“树”结构进行存储的。而且znode节点还分为4中不同的类型。
每一个znode默认能够存储1MB的数据(对于记录状态性质的数据来说,够了)
可以使用zkCli命令,登录到zookeeper上,并通过ls、create、delete、get、set等命令操作这些znode节点
8.Znode节点类型有哪些?
答:(1)PERSISTENT 持久化节点: 所谓持久节点,是指在节点创建后,就一直存在,直到有删除操作来主动清除这个节点。否则不会因为创建该节点的客户端会话失效而消失。
(2)PERSISTENT_SEQUENTIAL 持久顺序节点:这类节点的基本特性和上面的节点类型是一致的。额外的特性是,在ZK中,每个父节点会为他的第一级子节点维护一份时序,会记录每个子节点创建的先后顺序。基于这个特性,在创建子节点的时候,可以设置这个属性,那么在创建节点过程中,ZK会自动为给定节点名加上一个数字后缀,作为新的节点名。这个数字后缀的范围是整型的最大值。 在创建节点的时候只需要传入节点 “/test_”,这样之后,zookeeper自动会给”test_”后面补充数字。
(3)EPHEMERAL 临时节点:和持久节点不同的是,临时节点的生命周期和客户端会 话绑定。也就是说,如果客户端会话失效,那么这个节点就会自动被清除掉。注意,这里提到的是会话失效,而非连接断开。另外,在临时节点下面不能创建子节点。
这里还要注意一件事,就是当你客户端会话失效后,所产生的节点也不是一下子就消失了,也要过一段时间,大概是10秒以内,可以试一下,本机操作生成节点,在服务器端用命令来查看当前的节点数目,你会发现客户端已经stop,但是产生的节点还在。
EPHEMERAL_SEQUENTIAL 临时自动编号节点:此节点是属于临时节点,不过带有顺序,客户端会话结束节点就消失。
9.什么是Dubbo?
Dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和Spring框架无缝集成。Dubbo框架,是基于容器运行的.。容器是Spring。
其核心部分包含:
1. 远程通讯: 提供对多种基于长连接的NIO框架抽象封装,包括多种线程模型,序列化,以及“请求-响应”模式的信息交换方式。
2. 集群容错: 提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持。
3. 自动发现: 基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器。
Dubbo能做什么?
1.透明化的远程方法调用,就像调用本地方法一样调用远程方法,只需简单配置,没有任何API侵入。
2.软负载均衡及容错机制,可在内网替代F5等硬件负载均衡器,降低成本,减少单点。
3. 服务自动注册与发现,不再需要写死服务提供方地址,注册中心基于接口名查询服务提供者的IP地址,并且能够平滑添加或删除服务提供者。
Dubbo的存在简单来说就是要减小service层的压力。
10.什么是RPC远程过程调用?
远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。
11.Dubbo中有哪些角色?
registry
注册中心. 是用于发布和订阅服务的一个平台.用于替代SOA结构体系框架中的ESB服务总线的。
发布
开发服务端代码完毕后, 将服务信息发布出去. 实现一个服务的公开.
订阅
客户端程序,从注册中心下载服务内容 这个过程是订阅.
订阅服务的时候, 会将发布的服务所有信息,一次性下载到客户端.
客户端也可以自定义, 修改部分服务配置信息. 如: 超时的时长, 调用的重试次数等.
Consumer
服务的消费者, 就是服务的客户端.
消费者必须使用Dubbo技术开发部分代码. 基本上都是配置文件定义.
provider
服务的提供者, 就是服务端.
服务端必须使用Dubbo技术开发部分代码. 以配置文件为主.
container
容器. Dubbo技术的服务端(Provider), 在启动执行的时候, 必须依赖容器才能正常启动.
默认依赖的就是spring容器. 且Dubbo技术不能脱离spring框架.
在2.5.3版本的dubbo中, 默认依赖的是spring2.5版本技术. 可以选用spring4.5以下版本.
在2.5.7版本的dubbo中, 默认依赖的是spring4.3.10版本技术. 可以选择任意的spring版本.
monitor
监控中心. 是Dubbo提供的一个jar工程.
主要功能是监控服务端(Provider)和消费端(Consumer)的使用数据的. 如: 服务端是什么,有多少接口,多少方法, 调用次数, 压力信息等. 客户端有多少, 调用过哪些服务端, 调用了多少次等.
12.Dubbo执行流程什么是?
0 start: 启动Spring容器时,自动启动Dubbo的Provider
1、register: Dubbo的Provider在启动后自动会去注册中心注册内容.注册的内容包括:
1.1 Provider的 IP
1.2 Provider 的端口.
1.3 Provider 对外提供的接口列表.哪些方法.哪些接口类
1.4 Dubbo 的版本.
1.5 访问Provider的协议.
2、subscribe: 订阅.当Consumer启动时,自动去Registry获取到所已注册的服务的信息.
3、notify: 通知.当Provider的信息发生变化时, 自动由Registry向Consumer推送通知.
4、invoke: 调用. Consumer 调用Provider中方法
4.1 同步请求.消耗一定性能.但是必须是同步请求,因为需要接收调用方法后的结果.
5、count:次数. 每隔2分钟,provoider和consumer自动向Monitor发送访问次数.Monitor进行统计.
13.说说Dubbo支持的协议有哪些?
1、Dubbo协议(官方推荐协议)
优点:
采用NIO复用单一长连接,并使用线程池并发处理请求,减少握手和加大并发效率,性能较好(推荐使用)
缺点:
大文件上传时,可能出现问题(不使用Dubbo文件上传)
2、RMI(Remote Method Invocation)协议
优点:
JDK自带的能力。可与原生RMI互操作,基于TCP协议
缺点:
偶尔连接失败.
3、Hessian协议
优点:
可与原生Hessian互操作,基于HTTP协议
缺点:
需hessian.jar支持,http短连接的开销大
14.Dubbo支持的注册中心有哪些?
1、Zookeeper(官方推荐)
优点:支持分布式.很多周边产品.
缺点: 受限于Zookeeper软件的稳定性.Zookeeper专门分布式辅助软件,稳定较优
2、Multicast
优点:去中心化,不需要单独安装软件.
缺点:Provider和Consumer和Registry不能跨机房(路由)
3、Redis
优点:支持集群,性能高
缺点:要求服务器时间同步.否则可能出现集群失败问题.
4、Simple
优点: 标准RPC服务.没有兼容问题
缺点: 不支持集群.
15.SessionFactory是线程安全的吗?Session是线程安全的吗,两个线程能够共享同一个Session吗?
答:SessionFactory对应Hibernate的一个数据存储的概念,它是线程安全的,可以被多个线程并发访问。SessionFactory一般只会在启动的时候构建。对于应用程序,最好将SessionFactory通过单例的模式进行封装以便于访问。Session是一个轻量级非线程安全的对象(线程间不能共享session),它表示与数据库进行交互的一个工作单元。Session是由SessionFactory创建的,在任务完成之后它会被关闭。Session是持久层服务对外提供的主要接口。Session会延迟获取数据库连接(也就是在需要的时候才会获取)。为了避免创建太多的session,可以使用ThreadLocal来取得当前的session,无论你调用多少次getCurrentSession()方法,返回的都是同一个session。
16.Session的load和get方法的区别是什么?
答:主要有以下三项区别:
1)如果没有找到符合条件的记录, get方法返回null,load方法抛出异常
2)get方法直接返回实体类对象, load方法返回实体类对象的代理
3)在Hibernate 3之前,get方法只在一级缓存(内部缓存)中进行数据查找, 如果没有找到对应的数据则越过二级缓存, 直接发出SQL语句完成数据读取; load方法则可以充分利用二级缓存中的现有数据;当然从Hibernate 3开始,get方法不再是对二级缓存只写不读,它也是可以访问二级缓存的
简单的说,对于load()方法Hibernate认为该数据在数据库中一定存在可以放心的使用代理来实现延迟加载,如果没有数据就抛出异常,而通过get()方法去取的数据可以不存在。
17.Session的save()、update()、merge()、lock()、saveOrUpdate()和persist()方法有什么区别?
答:Hibernate的对象有三种状态:瞬态、持久态和游离态。游离状态的实例可以通过调用save()、persist()或者saveOrUpdate()方法进行持久化;脱管状态的实例可以通过调用 update()、0saveOrUpdate()、lock()或者replicate()进行持久化。save()和persist()将会引发SQL的INSERT语句,而update()或merge()会引发UPDATE语句。save()和update()的区别在于一个是将瞬态对象变成持久态,一个是将游离态对象变为持久态。merge方法可以完成save()和update()方法的功能,它的意图是将新的状态合并到已有的持久化对象上或创建新的持久化对象。按照官方文档的说明:(1)persist()方法把一个瞬态的实例持久化,但是并"不保证"标识符被立刻填入到持久化实例中,标识符的填入可能被推迟到flush的时间;(2) persist"保证",当它在一个事务外部被调用的时候并不触发一个Insert语句,当需要封装一个长会话流程的时候,一个persist这样的函数是需要的。(3)save"不保证"第2条,它要返回标识符,所以它会立即执行Insert语句,不管是不是在事务内部还是外部。update()方法是把一个已经更改过的脱管状态的对象变成持久状态;lock()方法是把一个没有更改过的脱管状态的对象变成持久状态。
18.什么是VSFTPD?
vsftpd 是“very secure FTP daemon”的缩写,安全性是它的一个最大的特点。vsftpd 是一个 UNIX 类操作系统上运行的服务器的名字,它可以运行在诸如 Linux、BSD、Solaris、 HP-UNIX等系统上面,是一个完全免费的、开放源代码的ftp服务器软件,支持很多其他的 FTP 服务器所不支持的特征。
19.什么是Nginx?
Nginx (engine x) 是一个高性能的HTTP和反向代理服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。
Nginx 是一个很强大的高性能Web和反向代理服务,它具有很多非常优越的特性:在连接高并发的情况下,Nginx是Apache服务不错的替代品:Nginx在美国是做虚拟主机生意的老板们经常选择的软件平台之一。
20.Nginx有哪些作用?
答:http协议代理
搭建虚拟主机
服务的反向代理
在反向代理中配置集群的负载均衡
21.什么是正向代理?
正向代理,意思是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端才能使用正向代理。
22.什么是反向代理?
反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。
23.什么是Redis?
答:Remote Dictionary Server(Redis)是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Map), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。
24.Redis的特点什么是?
1. 支持多种数据结构,如 string(字符串)、 list(双向链表)、dict(hash表)、set(集合)、zset(排序set)、hyperloglog(基数估算)
2. 支持持久化操作,可以进行aof及rdb数据持久化到磁盘,从而进行数据备份或数据恢复等操作,较好的防止数据丢失的手段。
3. 支持通过Replication进行数据复制,通过master-slave机制,可以实时进行数据的同步复制,支持多级复制和增量复制,master-slave机制是Redis进行HA的重要手段。
单进程请求,所有命令串行执行,并发情况下不需要考虑数据一致性问题。
25.Redis数据类型有哪些?
答:String(字符串)
Hash(hash表)
List(链表)
Set(集合)
SortedSet(有序集合zset)
26.Redis中的常用命令哪些?
incr 让当前键值以1的数量递增,并返回递增后的值
incrby 可以指定参数一次增加的数值,并返回递增后的值
incrby 可以指定参数一次增加的数值,并返回递增后的值
decrby 可以指定参数一次递减的数值,并返回递减后的值
incrbyfloat 可以递增一个双精度浮点数
append 作用是向键值的末尾追加value。如果键不存在则将该键的值设置为value。返回值是追加后字符串的总长度。
mget/mset 作用与get/set相似,不过mget/mset可以同时获得/设置多个键的键值
del 根据key来删除value
flushdb 清除当前库的所有数据
hset 存储一个哈希键值对的集合
hget获取一个哈希键的值
hmset 存储一个或多个哈希是键值对的集合
hmget 获取多个指定的键的值
hexists 判断哈希表中的字段名是否存在 如果存在返回1 否则返回0
hdel 删除一个或多个字段
hgetall 获取一个哈希是键值对的集合
hvals 只返回字段值
hkeys 只返回字段名
hlen 返回key的hash的元素个数
lpush key value向链表左侧添加
rpush key value向链表右侧添加
lpop key 从左边移出一个元素
rpop key 从右边移出一个元素
llen key 返回链表中元素的个数 相当于关系型数据库中 select count(*)
lrange key start end lrange命令将返回索引从start到stop之间的所有元素。Redis的列表起始索引为0。
lrange也支持负索引 lrange nn -2 -1 如 -1表示最右边第一个元素 -2表示最右边第二个元素,依次类推。
lindex key indexnumber 如果要将列表类型当做数组来用,lindex命令是必不可少的。lindex命令用来返回指定索引的元素,索引从0开始
如果是负数表示从右边开始计算的索引,最右边元素的索引是-1。
Lset key indexnumber value 是另一个通过索引操作列表的命令,它会将索引为index的元素赋值为value。
sadd key value 添加一个string元素到,key对应的set集合中,成功返回1,如果元素已经在集合中返回0
scard key 返回set的元素个数,如果set是空或者key不存在返回0
smembers key 返回key对应set的所有元素,结果是无序的
sismember key value 判断value 是否在set中,存在返回1,0表示不存在或者key不存在
srem key value 从key对应set中移除给定元素,成功返回1,如果value 在集合中不存在或者key不存在返回0
zadd key score value 将一个或多个value及其socre加入到set中
zrange key start end 0和-1表示从索引为0的元素到最后一个元素(同LRANGE命令相似)
zrange key 0 -1 withscores 也可以连同score一块输出,使用WITHSCORES参数
zremrangebyscore key start end 可用于范围删除操作
ping 测试redis是否链接 如果已链接返回 PONG
echo value测试redis是否链接 如果已链接返回 echo命令后给定的值
keys * 返回所有的key 可以加*通配
exists key判断string类型一个key是否存在 如果存在返回1 否则返回0
expire key time(s) 设置一个key的过期时间 单位秒。时间到达后会删除key及value
ttl key 查询已设置过期时间的key的剩余时间 如果返回-2表示该键值对已经被删除
persist 移除给定key的过期时间
select dbindex 选择数据库(0-15)
move key dbIndex 将当前数据库中的key转移到其他数据库中
dbsize 返回当前数据库中的key的数目
info 获取服务器的信息和统计
flushdb 删除当前选择的数据库中的key
flushall 删除所有数据库中的所有key
quit 退出连接
27.Redis的配置以及持久化方案有几种?
答:以下两种
RDB方式
AOF方式
28.什么是RDB方式?
答:是RDB是对内存中数据库状态进行快照
RDB方式:将Redis在内存中的数据库状态保存到磁盘里面,RDB文件是一个经过压缩的二进制文件,通过该文件可以还原生成RDB文件时的数据库状态(默认下,持久化到dump.rdb文件,并且在redis重启后,自动读取其中文件,据悉,通常情况下一千万的字符串类型键,1GB的快照文件,同步到内存中的 时间是20-30秒)
RDB的生成方式:
1、执行命令手动生成
有两个Redis命令可以用于生成RDB文件,一个是SAVE,另一个是BGSAVE SAVE命令会阻塞Redis服务器进程,直到RDB文件创建完毕为止,在服务器进程阻塞期间,服务器不能处理任何命令请求,BGSAVE命令会派生出一个子进程,然后由子进程负责创建RDB文件,服务器进程(父进程)继续处理命令请求,创建RDB文件结束之前,客户端发送的BGSAVE和SAVE命令会被服务器拒绝
2、通过配置自动生成
可以设置服务器配置的save选项,让服务器每隔一段时间自动执行一次BGSAVE命令,可以通过save选项设置多个保存条件,但只要其中任意一个条件被满足,服务器就会执行BGSAVE命令
例如:
save 900 1
save 300 10
save 60 10000
那么只要满足以下三个条件中的任意一个,BGSAVE命令就会被执行
服务器在900秒之内,对数据库进行了至少1次修改
服务器在300秒之内,对数据库进行了至少10次修改
服务器在60秒之内,对数据库进行了至少10000次修改
29.什么是AOF方式?
AOF持久化方式在redis中默认是关闭的,需要修改配置文件开启该方式。
AOF:把每条命令都写入文件,类似mysql的binlog日志
AOF方式:是通过保存Redis服务器所执行的写命令来记录数据库状态的文件。
AOF文件刷新的方式,有三种:
appendfsync always – 每提交一个修改命令都调用fsync刷新到AOF文件,非常非常慢,但也非常安全
appendfsync everysec – 每秒钟都调用fsync刷新到AOF文件,很快,但可能会丢失一秒以内的数据
appendfsync no – 依靠OS进行刷新,redis不主动刷新AOF,这样最快,但安全性就差
默认并推荐每秒刷新,这样在速度和安全上都做到了兼顾
AOF数据恢复方式
服务器在启动时,通过载入和执行AOF文件中保存的命令来还原服务器关闭之前的数据库状态,具体过程:
载入AOF文件
创建模拟客户端
从AOF文件中读取一条命令
使用模拟客户端执行命令
循环读取并执行命令,直到全部完成
如果同时启用了RDB和AOF方式,AOF优先,启动时只加载AOF文件恢复数据
30.什么是全文检索?
答:什么叫做全文检索呢?这要从我们生活中的数据说起。
我们生活中的数据总体分为两种:结构化数据和非结构化数据。
1)结构化数据:指具有固定格式或有限长度的数据,如数据库,元数据等。
2)非结构化数据:指不定长或无固定格式的数据,如邮件,word文档等。
非结构化数据又一种叫法叫全文数据。
按照数据的分类,搜索也分为两种:
1)对结构化数据的搜索:如对数据库的搜索,用SQL语句。
2)对非结构化数据的搜索:如利用windows的搜索也可以搜索文件内容,
全文检索: 就是一种将文件中所有文本与检索项匹配的文字资料检索方法。全文检索首先将要查询的目标文档中的词提取出来,组成索引,通过查询索引达到搜索目标文档的目的。这种先建立索引,再对索引进行搜索的过程就叫全文检索(Full-text Search)。
31.什么是Lucene?
Lucene是一个高效的,基于Java的全文检索库。
Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。Lucene是一套用于全文检索和搜寻的开源程序库,由Apache软件基金会支持和提供。Lucene提供了一个简单却强大的应用程序接口,能够做全文索引和搜寻。在Java开发环境里Lucene是一个成熟的免费开源工具。就其本身而言,Lucene是当前以及最近几年最受欢迎的免费Java信息检索程序库。
32.什么是Solr?
答:Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口。
Solr是一个高性能,采用Java开发,基于Lucene的全文搜索服务器。同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展并对查询性能进行了优化,并且提供了一个完善的功能管理界面,是一款非常优秀的全文检索引擎。
文档通过Http利用XML 加到一个搜索集合中。查询该集合也是通过http收到一个XML/JSON响应来实现。它的主要特性包括:高效、灵活的缓存功能,垂直搜索功能,高亮显示搜索结果,通过索引复制来提高可用性,提供一套强大Data Schema来定义字段,类型和设置文本分析,提供基于Web的管理界面等。
33.Solr是由哪两个部分构成?
答:如下两个部分
Solr的web服务
Solr的索引库
34.什么是正排索引?
正排索引是以文档的ID为关键字,索引文档中每个字的位置信息,查找时扫描索引中每个文档中字的信息直到找出所有包含查询关键字的文档。
但是在查询的时候需对所有的文档进行扫描以确保没有遗漏,这样就使得检索时间大大延长,检索效率低下。
尽管正排索引的工作原理非常的简单,但是由于其检索效率太低,除非在特定情况下,否则实用性价值不大。
35.什么是倒排索引?
对数据进行分析,抽取出数据中的词条,以词条作为key,对应数据的存储位置作为value,实现索引的存储。这种索引称为倒排索引。
当solr存储文档时,solr会首先对文档数据进行分词,创建索引库和文档数据库。所谓的分词是指:将一段字符文本按照一定的规则分成若干个单词。
36.什么是ActiveMQ?
ActiveMQ是一种开源的,实现了JMS1.1规范的,面向消息(MOM)的中间件,为应用程序提供高效的、可扩展的、稳定的和安全的企业级消息通信。ActiveMQ使用Apache提供的授权,任何人都可以对其实现代码进行修改。
ActiveMQ的设计目标是提供标准的,面向消息的,能够跨越多语言和多系统的应用集成消息通信中间件。
ActiveMQ实现了JMS标准并提供了很多附加的特性。这些附加的特性包括,JMX管理(java Management Extensions,即java管理扩展),主从管理(master/salve,这是集群模式的一种,主要体现在可靠性方面,当主中介(代理)出现故障,那么从代理会替代主代理的位置,不至于使消息系统瘫痪)、消息组通信(同一组的消息,仅会提交给一个客户进行处理)、有序消息管理(确保消息能够按照发送的次序被接受者接收)。消息优先级(优先级高的消息先被投递和处理)、订阅消息的延迟接收(订阅消息在发布时,如果订阅者没有开启连接,那么当订阅者开启连接时,消息中介将会向其提交之前的,其未处理的消息)、接收者处理过慢(可以使用动态负载平衡,将多数消息提交到处理快的接收者,这主要是对PTP消息所说)、虚拟接收者(降低与中介的连接数目)、成熟的消息持久化技术(部分消息需要持久化到数据库或文件系统中,当中介崩溃时,信息不会丢失)、支持游标操作(可以处理大消息)、支持消息的转换、通过使用Apache的Camel可以支持EIP、使用镜像队列的形式轻松的对消息队列进行监控等。
37.消息服务的应用场景有哪些?
答:如下3个场景都可以使用消息服务
1、异步处理
2、应用的解耦
3、流量的削峰
38.什么是JMS?
JMS(Java Messaging Service)是Java平台上有关面向消息中间件的技术规范,它便于消息系统中的Java应用程序进行消息交换,并且通过提供标准的产生、发送、接收消息的接口,简化企业应用的开发。
39.JMS有哪些模型?
答:JMS消息机制主要分为两种模型:PTP模型和Pub/Sub模型。
1、PTP模型:(Point to Point 对点模型) 每一个消息传递给一个消息消费者,保证消息传递给消息消费者,且消息不会同时被多个消费者接收。如果消息消费者暂时不在连接范围内,JMS会自动保证消息不会丢失,直到消息消费者进入连接,消息将自动送达。因此,JMS需要将消息保存到永久性介质上,例如数据库或者文件。
2、Pub-Sub模型:(publish-subscription 发布者订阅者模型)每个主题可以拥有多个订阅者。JMS系统负责将消息的副本传给该主题的每个订阅者。
如果希望每一条消息都能够被处理,那么应该使用PTP消息模型。如果并不要求消息都必须被消息消费者接收到的情况下,可使用pub-sub消息模型。Pub-Sub模型可以在一对多的消息广播时使用。
40.什么是JsonP?
Jsonp(JSON with Padding) 是 json 的一种"使用模式",可以让网页从别的域名(网站)那获取资料,即跨域读取数据。
41.什么是跨域?
跨域是指一个域(网站)下的文档或脚本试图去请求另一个域(网站)下的资源。
42.什么是同源策略?
同源策略/SOP(Same origin policy)是一种约定,由Netscape公司1995年引入浏览器,它是浏览器最核心也最基本的安全功能,现在所有支持JavaScript 的浏览器都会使用这个策略。如果缺少了同源策略,浏览器很容易受到XSS、CSFR等攻击。所谓同源是指"协议+域名+端口"三者相同,即便两个不同的域名指向同一个ip地址,也非同源
43.什么是MyCat?
MyCat是目前最流行的基于java语言编写的数据库中间件,是一个实现了MySQL协议的服务器,前端用户可以把它看作是一个数据库代理,用MySQL客户端工具和命令行访问,而其后端可以用MySQL原生协议与多个MySQL服务器通信,也可以用JDBC协议与大多数主流数据库服务器通信,其核心功能是分库分表。配合数据库的主从模式还可实现读写分离。
MyCat是基于阿里开源的Cobar产品而研发,Cobar的稳定性、可靠性、优秀的架构和性能以及众多成熟的使用案例使得MyCat变得非常的强大。
MyCat发展到目前的版本,已经不是一个单纯的MySQL代理了,它的后端可以支持MySQL、SQL Server、Oracle、DB2、PostgreSQL等主流数据库,也支持MongoDB这种新型NoSQL方式的存储,未来还会支持更多类型的存储。而在最终用户看来,无论是那种存储方式,在MyCat里,都是一个传统的数据库表,支持标准的SQL语句进行数据的操作,这样一来,对前端业务系统来说,可以大幅降低开发难度,提升开发速度。
44.什么是纵向切分/垂直切分?
就是把原本存储于一个库的数据存储到多个库上。
由于对数据库的读写都是对同一个库进行操作,所以单库并不能解决大规模并发写入的问题。
例如,我们会建立定义数据库workDB、商品数据库payDB、用户数据库userDB、日志数据库logDB等,分别用于存储项目数据定义表、商品定义表、用户数据表、日志数据表等。
优点
1)减少增量数据写入时的锁对查询的影响。
2)由于单表数量下降,常见的查询操作由于减少了需要扫描的记录,使得单表单次查询所需的检索行数变少,减少了磁盘IO,时延变短。
缺点:
无法解决单表数据量太大的问题。
横向切分/水平切分
把原本存储于一个表的数据分块存储到多个表上。当一个表中的数据量过大时,我们可以把该表的数据按照某种规则,进行划分,然后存储到多个结构相同的表,和不同的库上。
例如,我们userDB中的userTable中数据量很大,那么可以把userDB切分为结构相同的多个userDB:part0DB、part1DB等,再将userDB上的userTable,切分为很多userTable:userTable0、userTable1等,然后将这些表按照一定的规则存储到多个userDB上。
优点:
1)单表的并发能力提高了,磁盘I/O性能也提高了。
2)如果出现高并发的话,总表可以根据不同的查询,将并发压力分到不同的小表里面。
缺点:无法实现表连接查询。
45.简述Tomcat,Apache,JBoss和WebLogic的区别和联系
答:Apache:全球应用最广泛的http服务器,免费,出自apache基金组织
Tomcat:应用也算非常广泛的web 服务器,支持部分j2ee,免费,出自 apache基金组织
JBoss:开源的应用服务器,比较受人喜爱,免费(文档要收费)
weblogic:应该说算是业界第一的app server,全部支持j2ee1.4(收费)
JBoss也支持j2ee
JBoss和WebLogic都含有Jsp和Servlet容器,也就可以做web容器,
JBoss和WebLogic也包含EJB容器,是完整的J2EE应用服务器
tomcat 只能做jsp和servlet的container
46.以下可以实现负载均衡的是()
A. | nagios |
B. | Jenkins |
C. | nginx |
D. | docker |
分析:答案: C Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等 |
47.Tomcat/ WebSphere/WebLogic的作用和特点
作用:
Tomcat:目前应用非常广泛的免费web服务器,支持部分j2ee。
WebSphere:是IBM集成软件平台。可做web服务器,WebSphere提供了可靠、灵活和健壮的集成软件。
Weblogic:是美国bea公司出品的一个基于j2ee架构的中间件。BEA WebLogic是用于开发、集成、部署和管理大型分布式Web应用、网络应用和数据库应用的Java应用服务器。
特点(区别):
1)价位不同:Tomcat的是免费的;WebLogic与WebSphere是收费的,而且价格不菲。
2) 开源性不同:Tomcat的是完全开源的,而其他两个不是。WebLogic与WebSphere都是对业内多种标准的全面支持,包括JSB、JMS、JDBC、XML和WML,使Web应用系统实施更简单,且保护投资,同时也使基于标准的解决方案的开发更加简便。
3) 扩展性的不同:WebLogic和WebSphere都是以其高扩展的架构体系闻名于业内,包括客户机连接的共享、资源 pooling以及动态网页。
4)应用范围的区别:Tomcat 是一个小型的轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。WebLogic和WebSphere是商业软件,功能齐全强大,主要应用于大型企业的大型项目。
5)安全性问题区别:因为Tomcat是开源的,所以它们的安全性相对来说比较低,万一应用服务器本身有什么漏洞,你是没办法向Apache索赔的。而WebLogic和WebSphere其容错、系统管理和安全性能已经在全球数以千记的关键任务环境中得以验证。
48.B/S和C/S的含义及其区别
C/S结构,即Client/Server(客户机/服务器)结构,通过将任务合理分配到Client端和Server端,降低了系统的通讯开销,可充分利用两端硬件环境优势。早期软件系统多以此作为首选设计标准。
B/S结构,即Browser/Server(浏览器/服务器)结构,是随着Internet技术的兴起,对C/S结构的一种变化或者改进的结构。在这种结构下,用户界面完全通过WWW浏览器实现,一部分事务逻辑在前端实现,但是主要事务逻辑在服务器端实现,节约了开发成本,便于软件维护。
区别
1、C/S是建立在局域网的基础上的。B/S是建立在广域网的基础上的,但并不是说B/S结构不能在局域网上使用。
2、B/S业务扩展简单方便,通过增加页面即可增加服务器功能。C/S的客户端还需要安装专用的客户端软件,不利于扩展。
3、B/S维护简单方便。开发、维护等几乎所有工作也都集中在服务器端,当企业对网络应用进行升级时,只需更新服务器端的软件就可以,这减轻了异地用户系统维护与升级的成本
4、B/S响应速度不及C/S;
5、B/S用户体验效果不是很理想
49.说说你对容器的理解
容器也是 java 程序,它的主要作用是为应用程序提供运行环境。容器用来接管安全性、并发性、事务处理、交换到辅助存储器和其它服务的责任
以tomcat为例:Tomcat是一个后台服务进程,其它的servlet(相当于DLL)是在Tomcat容器内运行,Broswer只与Tomcat通迅; Tomcat接受browser的请求,经过一系列动作(如果是静态网页,那么装载,按http协议形成响应流;如果是动态的如JSP,那就要调用JDK 中的servlet.jsp接口,解释形成静态网页,按http协议生成响应流发送回browser)后,形成静态网页,返回响应。
50.为什么要使用连接池?
•传统的数据库连接方式
一个连接对象对应一个物理连接
每次操作都打开一个物理连接,
使用完都关闭连接,造成系统性能低下。
•连接池技术
客户程序得到的连接对象是连接池中物理连接的一个句柄,调用连接对象的close()方法,物理连接并没有关闭,数据源的实现只是删除了客户程序中的连接对象和池中的连接对象之间的联系.
•数据库连接的建立及关闭是耗费系统资源的操作,在大型应用中对系统的性能影响尤为明显。为了能重复利用数据库连接对象,缩短请求的响应时间和提高服务器的性能,支持更多的客户,应采用连接池技术.
51.数据库连接池的原理
数据库连接池的原理
传统连接方式:
首先调用Class.forName()方法加载数据库驱动,
然后调用DriverManager.getConnection()方法建立连接.
连接池技术:
连接池解决方案是在应用程序启动时就预先建立多个数据库连接对象,然后将连接对象保存到连接池中。
当客户请求到来时,从池中取出一个连接对象为客户服务。
当请求完成时,客户程序调用close()方法,将连接对象放回池中.
对于多于连接池中连接数的请求,排队等待。
应用程序还可根据连接池中连接的使用率,动态增加或减少池中的连接数。
52.MVC模式及其优缺点
一、MVC原理
MVC是一种程序开发设计模式,它实现了显示模块与功能模块的分离。提高了程序的可维护性、可移植性、可扩展性与可重用性,降低了程序的开发难度。它主要分模型、视图、控制器三层。
1、模型(model)它是应用程序的主体部分,主要包括业务逻辑模块和数据模块。模型与数据格式无关,这样一个模型能为多个视图提供数据。由于应用于模型的代码只需写一次就可以被多个视图重用,所以减少了代码的重复性
2、视图(view) 用户与之交互的界面、在web中视图一般由jsp,html组成
3、控制器(controller)接收来自界面的请求 并交给模型进行处理 在这个过程中控制器不做任何处理只是起到了一个连接的作用
二、MVC的优点
1、降低代码耦合性。在MVC模式中,三个层各施其职,所以如果一旦哪一层的需求发生了变化,就只需要更改相应的层中的代码而不会影响到其他层中的代码。
2、有利于分工合作。在MVC模式中,由于按层把系统分开,那么就能更好的实现开发中的分工。网页设计人员可进行开发视图层中的JSP,而对业务熟悉的人员可开发业务层,而其他开发人员可开发控制层。
3、有利于组件的重用。如控制层可独立成一个能用的组件,表示层也可做成通用的操作界面。可以为一个模型在运行时同时建立和使用多个视图。
三、MVC的不足之处
1、增加了系统结构和实现的复杂性。对于简单的界面,严格遵循MVC,使模型、视图与控制器分离,会增加结构的复杂性,并可能产生过多的更新操作,降低运行效率。
2、视图与控制器间的过于紧密的连接。视图与控制器是相互分离,但确实联系紧密的部件,视图没有控制器的存在,其应用是很有限的,反之亦然,这样就妨碍了他们的独立重用。
3、视图对模型数据的低效率访问。依据模型操作接口的不同,视图可能需要多次调用才能获得足够的显示数据。对未变化数据的不必要的频繁访问,也将损害操作性能。
4、目前,一般高级的界面工具或构造器不支持模式。改造这些工具以适应MVC需要和建立分离的部件的代价是很高的,从而造成MVC使用的困难。
53.MVC模式完成分页功能的基本思路是什么?
1)页面提交页码(第几页)到Servlet中
2)Servlet接收到页码后,将页码传递给分页工具类(PageBean)
3)Servlet中调用Service层传入PageBean对象
4)Service层调用DAO层传入PageBean对象
5)Servlet中得到查询出来的数据,并setAttrivute保存
6)在页面中得到(getAttribute)数据,遍历输出
54.常用的Web容器
答: Unix和Linux平台下使用最广泛的免费HTTP服务器是Apache服务器,而Windows平台的服务器通常使用IIS作为Web服务器。选择Web服务器应考虑的因素有:性能、安全性、日志和统计、虚拟主机、代理服务器、缓冲服务和集成应用程序等。下面是对常用服务器的简介:
IIS:Microsoft的Web服务器产品为Internet Information Services。IIS 是允许在公共Intranet或Internet上发布信息的Web服务器。IIS是目前最流行的Web服务器产品之一,很多著名的网站都是建立在IIS的平台上。IIS提供了一个图形界面的管理工具,称为Internet服务管理器,可用于监视配置和控制Internet服务。IIS是一种Web服务组件,其中包括Web服务器、FTP服务器、NNTP服务器和SMTP服务器,分别用于网页浏览、文件传输、新闻服务和邮件发送等方面,它使得在网络(包括互联网和局域网)上发布信息成了一件很容易的事。它提供ISAPI(Intranet Server API)作为扩展Web服务器功能的编程接口;同时,它还提供一个Internet数据库连接器,可以实现对数据库的查询和更新。
Kangle:Kangle Web服务器是一款跨平台、功能强大、安全稳定、易操作的高性能Web服务器和反向代理服务器软件。此外,Kangle也是一款专为做虚拟主机研发的Web服务器。实现虚拟主机独立进程、独立身份运行。用户之间安全隔离,一个用户出问题不影响其他用户。支持PHP、ASP、ASP.NET、Java、Ruby等多种动态开发语言。
WebSphere:WebSphere Application Server是功能完善、开放的Web应用程序服务器,是IBM电子商务计划的核心部分,它是基于Java的应用环境,用于建立、部署和管理Internet和Intranet Web应用程序,适应各种Web应用程序服务器的需要,范围从简单到高级直到企业级。
WebLogic:BEA WebLogic Server是一种多功能、基于标准的Web应用服务器,为企业构建自己的应用提供了坚实的基础。各种应用开发、部署所有关键性的任务,无论是集成各种系统和数据库,还是提交服务、跨Internet协作,Weblogic都提供了相应的支持。由于它具有全面的功能、对开放标准的遵从性、多层架构、支持基于组件的开发,基于Internet的企业都选择它来开发、部署最佳的应用。BEA WebLogic Server在使应用服务器成为企业应用架构的基础方面一直处于领先地位,为构建集成化的企业级应用提供了稳固的基础,它们以 Internet的容量和速度,在连网的企业之间共享信息、提交服务,实现协作自动化。
Apache:目前Apache仍然是世界上用得最多的Web服务器,市场占有率约为60%左右。世界上很多著名的网站都是Apache的产物,它的成功之处主要在于它的源代码开放、有一支强大的开发团队、支持跨平台的应用(可以运行在几乎所有的Unix、Windows、Linux系统平台上)以及它的可移植性等方面。
Tomcat:Tomcat是一个开放源代码、运行Servlet和JSP的容器。TomcatServer实现了Servlet和JSP规范。此外,Tomcat还实现了Apache-Jakarta规范而且比绝大多数商业应用软件服务器要好,因此目前也有不少的Web服务器都选择了Tomcat。
Nginx:读作"engine x",是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器。 Nginx是由Igor Sysoev为俄罗斯访问量第二的 Rambler.ru站点开发的,第一个公开版本0.1.0发布于2004年10月4日。其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。
55.Java Web开发的Model 1和Model 2分别指的是什么?
答:Model 1是以页面为中心的Java Web开发,只适合非常小型的应用程序,Model 2是基于MVC架构模式的应用,这一点在前文的面试题中已经详细讲解过了。
56.说说什么是框架:
框架(framework)是一个框子–》指约束性,也是一个架子–》指支撑性IT语境中的框架,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构,在此结构上可以根据具体问题扩展、按插更多的组成部分,从而更迅速和方便地架构完整的解决问题的方案。
1)框架本身一般不完整到可以解决特定问题,但是可以帮助您快速解决特定问题:
没有框架所有的工作都从零开始做,有了框架,为我们提供了一定的功能。我们就可以在框架的基础上开发,极大的解决了生产力。
不同的框架,是为了解决不同领域的问题,一定要为了解决问题才去学习框架。
2)框架天生就是为了扩展而设计的
3)框架里面可以为后续的组件提供很多辅助性、支撑性的方便易用的实用工具(utilities),也就是框架时常配套一些帮组解决某类问题的库(libraries)或工具(tools).
在java中就是一系列的jar包,其本质就是对jdk功能的扩展。
57.简单说一下MVC框架?
是为了解决传统MVC模式(jsp+servlet+javabean)一些问题而出现的框架
传统MVC模式模式问题:
1) 所有的Servlet和Servlet映射都要配置在web.xml中,如果项目太大,web.xml就太庞大并且不能实现模块化管理。
2)Servlet的主要功能就是接受参数、调用逻辑、跳转页面,比如像其他字符编码、文件上传等功能也要写在Servlet中,不能让Servlet主要功能而需要做处理一些特例。
3)接受参数比较麻烦
(String name = request.getParameter(“name”)),不能通过model接受,只能单个接收,接收完成后转换封装model。
4)跳转页面方式比较单一(forward,redirect),并且当我们的页面名称发生改变时需要改变Servlet源代码。
现在比较常用的MVC框架:
webwork
Struts
Struts2
SpringMVC
58.简单讲一下struts2的执行流程
一个请求在struts2框架中处理大概分为一下几个步骤:
1)客户浏览器发送一个指向Servlet容器(例如Tomcat)的请求
2)这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin)
3)接着FilterDispatcher(StrutsPrepareAndExecuteFilter)被调用,FilterDispatcher询问ActionMapper来决定这个请是否需要调用某个Action
4)如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy
5)ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类
6)ActionProxy创建一个ActionInvocation的实例。
7)ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。
8)一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也 可 能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2 框架中继承的标签。在这个过程中需要涉及到ActionMapper
59.Struts2中的拦截器,你都用它干什么?
java里的拦截器是动态拦截Action调用的对象,它提供了一种机制可以使开发者定义一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行,同时也提供了一种可以提取action中可重用部分的方式。
在AOP(Aspect Oriented Programming)中拦截器用于在某个方法或字段被访问之前,进行拦截后在之前或之后加入某些操作
1)struts2中的功能(参数处理、文件上传、字符编码等)都是通过系统拦截器实现的
2)当然我们也可以自定义拦截器,进行可插拔配置,可以执行Action的方法前后,加入相关逻辑完成业务。
使用场景:
1)用户登录判断,在执行action的前面判断是否已经登录,如果没有登录的就跳转登录页面。
2)用户权限判断,在执行action的前面判断是否具有,如果没有权限就给出提示信息。
3)操作日志…
60.简单讲一下SpringMVC的执行流程?
1)用户向服务器发送请求,请求被Spring 前端控制Servelt DispatcherServlet捕获;
2)DispatcherServlet 对请求URL进行解析,得到请求资源标识符(URI)。然后根据该URI,调用HandlerMapping获得该Handler配置的所有相关的对象 (包括Handler对象以及Handler对象对应的拦截器),最后以HandlerExecutionChain对象的形式返回;
3)DispatcherServlet 根据获得的Handler,选择一个合适的HandlerAdapter。(附注:如果成功获得HandlerAdapter后,此时将开始执行拦截器的preHandler(…)方法)
4) 提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)。 在填充Handler的入参过程中,根据你的配置,Spring将帮你做一些额外的工作:
HttpMessageConveter: 将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息
数据转换:对请求消息进行数据转换。如String转换成Integer、Double等
数据根式化:对请求消息进行数据格式化。 如将字符串转换成格式化数字或格式化日期等
数据验证: 验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中
5)Handler执行完成后,向DispatcherServlet 返回一个ModelAndView对象;
6)根据返回的ModelAndView,选择一个适合的ViewResolver(必须是已经注册到Spring容器中的ViewResolver)返回给DispatcherServlet ;
7)ViewResolver 结合Model和View,来渲染视图
8)将渲染结果返回给客户端。
快速记忆:
核心控制器捕获请求,查找Hander,执行Handler,选择ViewResolver,通过ViewResoler渲染视图并返回
61.简单说一下struts2和springMVC有什么不同
目前企业中使用SpringMvc的比例已经远远超过Struts2,那么两者到底有什么区别,是很多初学者比较关注的问题,下面我们就来对SpringMvc和Struts2进行各方面的比较:
1)核心控制器(前端控制器、预处理控制器):对于使用过mvc框架的人来说这个词应该不会陌生,核心控制器的主要用途是处理所有的请求,然后对那些特殊的请求 (控制器)统一的进行处理(字符编码、文件上传、参数接受、异常处理等等),spring mvc核心控制器是Servlet,而Struts2是Filter。
2)控制器实例:Spring Mvc会比Struts快一些(理论上)。Spring Mvc是基于方法设计,而Sturts是基于对象,每次发一次请求都会实例一个action,每个action都会被注入 属性,而Spring更像Servlet一样,只有一个实例,每次请求执行对应的方法即可(注意:由于是单例实例,所以应当避免全局变量的修改,这样会产生线程安全问题 )
3)管理方式:大部分的公司的核心架构中,就会使用到spring,而spring mvc又是spring中的一个模块,所以spring对于spring mvc的控制器管理更加简单方便,而且提供了全 注解方式进行管理,各种功能的注解都比较全面,使用简单,而struts2需要采用XML很多的配置参数来管理(虽然也可以采用注解,但是几乎没有公司那 样使用)
4)参数传递:Struts2中自身提供多种参数接受,其实都是通过(ValueStack)进行传递和赋值,而SpringMvc是通过方法的参数进行接收。
5)学习难度:Struts更加很多新的技术点,比如拦截器、值栈及OGNL表达式,学习成本较高,springmvc 比较简单,很较少的时间都能上手。
6)intercepter 的实现机制:struts有以自己的interceptor机制,spring mvc用的是独立的AOP方式。这样导致struts的配置文件量还是比spring mvc大,虽然struts的配置能继承,所以我觉得论使用上来讲,spring mvc使用更加简洁,开发效率Spring MVC确实比struts2高。spring mvc是方法级别的拦截,一个方法对应一个request上下文,而方法同时又跟一个url对应,所以说从架构本身上spring3 mvc就容易实现restful url。struts2是类级别的拦截,一个类对应一个request上下文;实现restful url要费劲,因为struts2 action的一个方法可以对应一个url;而其类属性却被所有方法共享,这也就无法用注解或其他方式标识其所属方法了。spring3 mvc的方法之间基本上独立的,独享request response数据,请求数据通过参数获取,处理结果通过ModelMap交回给框架方法之间不共享变量,而struts2搞的就比较乱,虽然方法之间 也是独立的,但其所有Action变量是共享的,这不会影响程序运行,却给我们编码,读程序时带来麻烦。
7)spring mvc处理ajax请求,直接通过返回数据,方法中使用注解@ResponseBody,spring mvc自动帮我们对象转换为JSON数据。而struts2是通过插件的方式来处理。
在springMVC流行起来之前,struts2在MVC框架中占核心地位,随着SpringMVC的出现,SpringMVC慢慢的取代了struts2,但是很多的企业原来搭建的框架都是使用struts2。
62.说一下Spring中的两大核心
Spring是什么?
Spring是J2EE应用程序框架,是轻量级的IOC和AOP的容器框架,主要针对JavaBean的生命周期进行管理的轻量级容器,可以单独使用,也可以和struts框架,ibatis框架等组合使用。
1)IOC(Inversion of Control)
ioc控制反转,又称为“依赖注入”;
IOC的基本概念是:不创建对象,但是描述创建它们的方式。在代码中不直接与对象和服务连接,但在配置文件中描述哪一个组件需要哪一项服务。容器负责将这些联系在一起。
其原理是基于OO设计原则的The Hollywood Principle:Don't call us, we'll call you(别找我,我会来找你的)。也就是说,所有的组件都是被动的(Passive),所有的组件初始化和调用都由容器负责。组件处在一个容器当中,由容 器负责管理。
简单的来讲,就是由容器控制程序之间的关系,而非传统实现中,由程序代码直接操控。这也就是所谓“控制反转”的概念所在:控制权由应用代码中转到了外部容器,控制权的转移,是所谓反转。
2)AOP 面向切面编程
核心原理:使用动态代理的设计模式在执行方法前后或出现异常常做加入相关逻辑
我们使用AOP来做:
1)事务处理:执行方法前开启事务,执行完成后关闭事务,出现异常后回滚事务
2)权限判断:在执行方法前,判断是否具有权限
3)日志:在执行前进行日志处理
63.讲一下Spring的事务的传播特性
多个事物存在是怎么处理的策略
1)PROPAGATION_REQUIRED:如果存在一个事务,则支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
2)PROPAGATION_SUPPORTS:如果存在一个事务,支持当前事务,如果当前没有事务,就以非事务方式执行。
3)PROPAGATION_MANDATORY:如果存在一个事务,支持当前事务,如果当前没有事务,就抛出异常。
4)PROPAGATION_REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起。
5)PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
6)PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
7)PROPAGATION_NESTED:支持当前事务,新增Savepoint点,与当前事务同步提交或回滚。
64.什么是ORM
对象关系映射(Object Relation Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术,简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中,那么到底如何实现持久化呢?一种简单的方案时采用硬编码方式(jdbc操作sql方式),为每一种可能的数据库访问操作提供单独的方法。
这种方案存在以下不足:
1. 持久化层缺乏弹性,一旦出现业务需求变更,就必须修改持久化层的接口
2. 持久化层同时与域模型与关系数据库模型绑定,不管域模型还是关系数据库模型发生变化,都要修改持久化层的相关程序代码,增加软件的维护难度。
ORM提供了实现持久化层的另一种模式,它采用映射元数据来描述对象关系的映射,使得ORM中间件能在任何一个应用的业务逻辑层和数据库层之间充当桥梁,Java典型的ORM框架有:Hibernate,ibatis(mybtis),speedframework。
ORM框架的方法论基于三个核心原则:
简单:以最基本的形式建模数据
传达性:数据库结构被任何人都能理解的语言文档化
精确性:基于数据模型创建正确标准化了结构
对象关系映射(Object Relation Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术,可以简单的方案采用硬编码方式(jdbc操作sql方式),为每一种可能的数据库访问操作提供单独的方法,这种方法存在很多缺陷,使用ORM框架(为了解决面向对象与关系数据库存在互不匹配的现象的框架)来解决。
65.Hibernate对象的状态
临时状态/瞬时状态(transient):刚刚用new语句创建,没有被持久化,无id
不处于session中(没有使用session的方法去操作临时对象),该对象成为临时对象
持久化状态,托管状态(persistent):已经被持久化,加入session的缓存中,session是没有关闭
该状态的对象为持久化对象。
游离状态,脱管状态(detached):已经被持久化,但不处于session中,该状态的对象为游离对象。
删除状态(removed):对象有关联的id,并且在session管理下,但是已经被计划(事务提交的时候,commit)删除,如果没有事务就不能删除
相互转换
66.介绍一下Hibernate的缓存
答:一、why(为什么要用Hibernate缓存?)
Hibernate是一种持久化层框架,经常访问物理数据库。
为了降低应用程序对物理数据源访问的频次,从而提高应用程序的运行性能
缓存内的数据是对物理数据源中的数据的复制,应用程序在运行时从缓存读写数据,在特定的时刻或事件会同步缓存和物理数据源的数据。
为了提高访问速度,把磁盘或者数据库访问变成内存访问
二、what(Hibernate缓存原理是怎样的?)Hibernate缓存包括两大类:Hibernate 一级缓存和Hibernate二级缓存
1. Hibernate一级缓存又称为”session的缓存”。
session缓存内置不能被卸载,session的缓存是事务范围的缓存(session对象的生命周期通常对应一个数据库事务或者一个应用事务)。
一级缓存中,持久化类的每个实例都具有唯一的OID
2. Hibernate的二级缓存又称为”sessionFactory的缓存”。
由于sessionFactory对象的生命周期和应用程序的整个过程对应,因此Hibernate二级缓存是进程范围或者集群范围的缓存,有可能出现并发问题,因此需要采用适当的并发访问策略,该策略为被缓存的数据提供了事务隔离级别。
第二级缓存是可选的,是一个可配置的插件,默认下sessionFactory不会启用这个插件。
什么样的数据适合存放到二级缓存中?
1) 很少被修改的数据 (帖子的最后回复时间)
2) 经常被查询的数据 (电商的地点)
3) 不是很重要的数据,允许出现偶尔并发的数据
4) 不会被并发访问的数据
5) 常量数据
扩展:Hibernate的二级缓存默认是不支持分布式缓存的,使用memcache,redis等中央缓存来代替二级缓存。
67.简单讲一下webservice使用的场景
webservice是一个SOA(面向服务的编程)的架构,它是不依赖于语言,不依赖于平台,可以实现不同的语言间的相互调用,通过Internet进行基于http协议的网络应用间的交互。
1、异构系统(不同的开发语言)的整合
2、不同客户端的整合 (浏览器、手机端(android\ios)、微信)
3、实实在在的例子:
天气预报:可以通过实现webservice客户端调用远程天气服务实现的
4、单点登录:一个服务实现所有系统的登录
68.简单介绍一下activity?
Activity是一个业务流程管理(BPM)和工作流系统,适用于开发人员和系统管理员,其核心是超快速,稳定的BPMN2的流程引擎,它易于与Spring集成使用。
主要用在OA中,把线下流程放在线上,把现实生活中一些流程固话定义到系统中,然后通过输入表单数据完成业务。
他可以用在OA系统的流程管理中
请假流程(小于三天,一级主管审批,大于三天二级主管审批)
报销流程(价格区间)
69.什么是MyBatis?
答:MyBatis是一个可以自定义SQL、存储过程和高级映射的持久层框架。
70.Mybatis是如何进行分页的?分页插件的原理是什么?
答:1)Mybatis使用RowBounds对象进行分页,也可以直接编写sql实现分页,也可以使用Mybatis的分页插件。
2)分页插件的原理:实现Mybatis提供的接口,实现自定义插件,在插件的拦截方法内拦截待执行的sql,然后重写sql。
举例:select * from student,拦截sql后重写为:select t.* from (select * from student)t limit 0,10
71.MyBatis与Hibernate有哪些不同?
答:1)Mybatis和hibernate不同,它不完全是一个ORM框架,因为MyBatis需要程序员自己编写Sql语句,不过mybatis可以通过XML或注解方式灵活配置要运行的sql语句,并将java对象和sql语句映射生成最终执行的sql,最后将sql执行的结果再映射生成java对象。
2)Mybatis学习门槛低,简单易学,程序员直接编写原生态sql,可严格控制sql执行性能,灵活度高,非常适合对关系数据模型要求不高的软件开发,例如互联网软件、企业运营类软件等,因为这类软件需求变化频繁,一但需求变化要求成果输出迅速。但是灵活的前提是mybatis无法做到数据库无关性,如果需要实现支持多种数据库的软件则需要自定义多套sql映射文件,工作量大。
3)Hibernate对象/关系映射能力强,数据库无关性好,对于关系模型要求高的软件(例如需求固定的定制化软件)如果用hibernate开发可以节省很多代码,提高效率。但是Hibernate的缺点是学习门槛高,要精通门槛更高,而且怎么设计O/R映射,在性能和对象模型之间如何权衡,以及怎样用好Hibernate需要具有很强的经验和能力才行。
总之,按照用户的需求在有限的资源环境下只要能做出维护性、扩展性良好的软件架构都是好架构,所以框架只有适合才是最好。
72.简述Mybatis的Xml映射文件和Mybatis内部数据结构之间的映射关系?
答: Mybatis将所有Xml配置信息都封装到All-In-One重量级对象Configuration内部。在Xml映射文件中,< parameterMap>标签会被解析为ParameterMap对象,其每个子元素会被解析为ParameterMapping对象。< resultMap>标签会被解析为ResultMap对象,其每个子元素会被解析为ResultMapping对象。每一个< select>、< insert>、< update>、< delete>标签均会被解析为MappedStatement对象,标签内的sql会被解析为BoundSql对象。
73.什么是MyBatis的接口绑定,有什么好处?
答:接口映射就是在MyBatis中任意定义接口,然后把接口里面的方法和SQL语句绑定,我们直接调用接口方法就可以,这样比起原来了SqlSession提供的方法我们可以有更加灵活的选择和设置.
74.Mybatis能执行一对一、一对多的关联查询吗?都有哪些实现方式,以及它们之间的区别?
答:能,Mybatis不仅可以执行一对一、一对多的关联查询,还可以执行多对一,多对多的关联查询,多对一查询,其实就是一对一查询,只需要把selectOne()修改为selectList()即可;多对多查询,其实就是一对多查询,只需要把selectOne()修改为selectList()即可。
关联对象查询,有两种实现方式,一种是单独发送一个sql去查询关联对象,赋给主对象,然后返回主对象。另一种是使用嵌套查询,嵌套查询的含义为使用join查询,一部分列是A对象的属性值,另外一部分列是关联对象B的属性值,好处是只发一个sql查询,就可以把主对象和其关联对象查出来。
75.MyBatis里面的动态Sql是怎么设定的?用什么语法?
答:MyBatis里面的动态Sql一般是通过if节点来实现,通过OGNL语法来实现,但是如果要写的完整,必须配合where,trim节点,where节点是判断包含节点有内容就插入where,否则不插入,trim节点是用来判断如果动态语句是以and 或or开始,那么会自动把这个and或者or取掉。
76.使用MyBatis的mapper接口调用时有哪些要求?
答:1)Mapper接口方法名和mapper.xml中定义的每个sql的id相同
2)Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型相同
3)Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同
4)Mapper.xml文件中的namespace即是mapper接口的类路径。
77.Mybatis是如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式?
答:第一种是使用< resultMap>标签,逐一定义列名和对象属性名之间的映射关系。
第二种是使用sql列的别名功能,将列别名书写为对象属性名,比如T_NAME AS NAME,对象属性名一般是name,小写,但是列名不区分大小写,Mybatis会忽略列名大小写,智能找到与之对应对象属性名,你甚至可以写成T_NAME AS NaMe,Mybatis一样可以正常工作。
有了列名与属性名的映射关系后,Mybatis通过反射创建对象,同时使用反射给对象的属性逐一赋值并返回,那些找不到映射关系的属性,是无法完成赋值的。
78.MyBatis接口绑定有几种实现方式,分别是怎么实现的?
答:接口绑定有两种实现方式,一种是通过注解绑定,就是在接口的方法上面加上@Select@Update等注解里面包含Sql语句来绑定,另外一种就是通过xml里面写SQL来绑定,在这种情况下,要指定xml映射文件里面的namespace必须为接口的全路径名.
79.MyBatis实现一对一有几种方式?具体怎么操作的?
答:有联合查询和嵌套查询,联合查询是几个表联合查询,只查询一次,通过在resultMap里面配置association节点配置一对一的类就可以完成;嵌套查询是先查一个表,根据这个表里面的结果的外键id,去再另外一个表里面查询数据,也是通过association配置,但另外一个表的查询通过select属性配置。
80.什么情况下用注解绑定,什么情况下用xml绑定?
答:当Sql语句比较简单时候,用注解绑定;当SQL语句比较复杂时候,用xml绑定,一般用xml绑定的比较多
81.MyBatis的好处是什么?
答:1) MyBatis把sql语句从Java源程序中独立出来, 放在单独的XML文件中编写,给程序的维护带来了很大便利。
2) MyBatis封装了底层JDBC API的调用细节,并能自动将结果集转换成Java Bean对象,大大简化了Java数据库编程的重复工作。
3) 因为MyBatis需要程序员自己去编写sql语句,程序员可以结合数据库自身的特点灵活控制sql语句, 因此能够实现比Hibernate等全自动orm框架更高的查询效率,能够完成复杂查询。
最新2022整理收集的一些高频面试题(都整理成文档),有很多干货,包含mysql,netty,spring,线程,spring cloud、jvm、源码、算法等详细讲解,也有详细的学习规划图,面试题整理等,需要获取这些内容的朋友点赞+关注后私信回复《222》即可免费获取!
原文链接:https://blog.csdn.net/q66562636/article/details/125643714