Spring,SpringMVC,MyBatis,Hibernate,Servlet的生命周期,jsp有哪些内置对象,Tomcat,Cookie和Session的作用以及区别,oracle,MYSQL等面试题总结

1、 什么是Spring,谈谈你对Spring的理解

Spring是我们JAVA开发人员在搭建后台时选用的一个轻量级的开源框架,Spring框架目前也是功能丰富,十分优秀企业级采用最多的一个框架。

Spring是一个IOC和AOP容器框架。它主要核心是:

(1).控制反转(IOC):以前传统的java开发模式中,当需要一个对象时我们,我们会自己使用new或者getInstance等直接或者间接调用构造方法创建一个对象,而在Spring开发模式中,Spring容器使用了工厂模式为我们创建了所需要的对象,我们使用时不需要自己去创建,直接调用Spring为我们提供的对象即可,这就是控制反转的思想。

dao接口的实现不再是业务逻辑层调用工厂类去获取,而是通过spring容器来自动的为我们的业务层设置Dao的实现类,这样整个过程就反过来,以前是我们业务层主动去获取dao,而现在是dao主动被设置到业务逻辑层中来了,这个也就是反转控制的由来。

实例化一个卫生java对象有三种方式:使用类构造器,使用静态工厂方法,使用实例工厂方法,当使用spring时我们就不需要关心通过何种方式实例化一个对象,spring通过控制反转机制自动为我们实例化一个对象。

 (2).面向切面编程(AOP):在面向对象编程(OOP)思想中,将程序中的交叉业务逻辑(比如安全,日志,事务)公共的部分,封装成一个切面,然后注入到目标业务逻辑中去。这样就不用每次抛异常都要手动记录日志。Spring的事务管理用到的就是AOP这样也可以提高程序的内聚性。这样的过程就是面向切面的思想。

(3).依赖注入(DI):Spring有三种注入方式:1,根据属性注入也叫setter方法注入。2,根据构造方法注入。3,根据注解进行注入(推荐)。Spring使用Java Bean对象的Set方法或者带参数的构造方法为我们在创建所需对象时将其属性自动设置所需要的值的过程就是依赖注入的基本思想。

2、 说说SpringMVC框架的工作原理

SpringMVC框架介绍:

Spring MVC是Spring 框架提供的构建Web 应用程序的全功能MVC 模块。Spring MVC框架是高度可配置的,而且包含多种视图技术,完全融合Spring框架,整体的模块化让WEB程序的开发变得非常灵活便捷。

Spring MVC 分离了控制器、模型对象、分派器以及处理程序对象的角色,这种分离让它们更容易进行定制。

Spring的MVC框架主要由DispatcherServlet、处理器映射、处理器(控制器)、视图解析器、视图组成。

SpringMVC运行原理:

1、客户端请求提交到DispatcherServlet。

2、由DispatcherServlet控制器查询一个或多个HandlerMapping,找到处理请求的Controller。

3、DispatcherServlet将请求提交到Controller。

4、Controller调用业务逻辑处理后,返回ModelAndView对象。

5、DispatcherServlet查询一个或多个ViewResoler视图解析器,找到ModelAndView指定的视图。

6、视图负责将结果显示到客户端。

3、 谈谈对MyBatis框架的理解

一、Mybatis是什么?

Mybatis是一个基于Java的持久层框架。这个持久层框架包括SQLMaps和DataAccessObjects(DAO)。

MyBatis 是支持定制化SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis避免了几乎所有的JDBC代码和手工设置参数以及抽取结果集。MyBatis使用简单的XML或注解来配置和映射基本体,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。

二、Mybatis的整个的执行原理:

1、MyBatis应用程序根据XML配置文件创建SqlSessionFactory。

2、SqlSessionFactory在根据配置,配置来源于两个地方,一处是配置文件一处是Java代码的注解,获取一个SqlSession。

3、SqlSession包含了执行sql所需要的所有方法,可以通过SqlSession实例直接运行映射的sql语句,完成对数据的增删改查和事务提交等,用完之后关闭SqlSession。

三、MyBatis的优缺点

优点:

1、简单易学mybatis本身就轻量而且简单,没有任何第三方依赖。

2、Mybatis实现了接口绑定,使用更加方便。Mybatis实现了DAO接口与xml映射文件的绑定,自动为我们生成接口的具体实现,使用起来变得更加省事和方便。

3、灵活mybatis不会对应用程序或者数据库的现有设计强加任何影响。sql写在xml里,便于统一管理和优化。

4、解除sql与程序代码的耦合通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。

5、提供映射标签,支持对象与数据库的orm字段关系映射。

6、提供对象关系映射标签,支持对象关系组建维护。

7、提供xml标签,支持编写动态sql。

缺点:

1、编写SQL语句时工作量很大,尤其是字段多、关联表多时,更是如此。

2、SQL语句依赖于数据库,导致数据库移植性差,不能更换数据库。

3、虽然简化了数据绑定代码,但是整个底层数据库查询实际还是要自己写的,工作量也比较大,而且不太容易适应快速数据库修改。

4、二级缓存机制不佳。

4、 讲一下MyBatis的缓存

MyBatis的缓存分为一级缓存和二级缓存:

一级缓存放在session里面,默认就有。

二级缓存放在它的命名空间里,默认是打开的,

使用二级缓存属性类需要实现Serializable序列化接口(可用来保存对象的状态),可在它的映射文件中配置

5、 Hibernate工作原理及为什么要用它

Hibernate 简介:

Hibernate是一个开源框架,它是对象关系映射的框架,它对JDBC做了轻量级的封装,而我们Java程序员可以使用面向对象的思想来操纵数据库。

Hibernate核心接口:

session:负责被持久化对象CRUD操作。

sessionFactory:负责初始化hibernate,创建session对象。

configuration:负责配置并启动hibernate,创建SessionFactory。

Transaction:负责事物相关的操作。

Query和Criteria接口:负责执行各种数据库查询。

为什么要用Hibernate:

1. 对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。

2. Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作。

3. Hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。

4. Hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。

6、 简述 Hibernate 和 JDBC 的优缺点

JDBC与Hibernate在性能上相比,JDBC灵活性有优势。而Hibernate在易学性,易用性上有些优势。当用到很多复杂的多表联查和复杂的数据库操作时,JDBC有优势。

相同点:

◆两者都是Java的数据库操作中间件。

◆两者对于数据库进行直接操作的对象都不是线程安全的,都需要及时关闭。

◆两者都可以对数据库的更新操作进行显式的事务处理。

不同点:

◆使用的SQL语言不同:JDBC使用的是基于关系型数据库的标准SQL语言,Hibernate使用的是HQL(Hibernate query language)语言

◆操作的对象不同:JDBC操作的是数据,将数据通过SQL语句直接传送到数据库中执行,Hibernate操作的是持久化对象,由底层持久化对象的数据更新到数据库中。

◆数据状态不同:JDBC操作的数据是“瞬时”的,变量的值无法与数据库中的值保持一致,而Hibernate操作的数据是可持久的,即持久化对象的数据属性的值是可以跟数据库中的值保持一致的。

7、 MyBatis与Hibernate有什么不同?

Hibernate与Mybatis对比总结:

一、两者相同点:

1、都屏蔽了JDBC的底层访问细节,使用我们不用与JDBC打交道,就可以访问数据。

2、都是通过SessionFactoryBuider由XML配置文件生成SessionFactory,然后由SessionFactory生成Session,最后由Session来开启执行事务和SQL语句。其中SessionFactoryBuider,SessionFactory,Session的生命周期都是差不多的。Hibernate和MyBatis都支持JDBC和JTA事务处理。

二、不同点:

1、Hibernate是全自动的,而Mybatis是半自动的。

Hibernate完全可以通过对象关系模型实现对数据库的操作,拥有完整的JavaBean对象与数据库的映射结构来自动生成sql。而Mybatis仅有基本的字段映射,对象数据以及对象实际关系仍然需要通过手写sql来实现和管理。

2、Hibernate数据库移植性远大于Mybatis。

Hibernate通过它强大的映射结构和HQL语言,大大降低了对象与数据库(Oracle、MySQL等)的耦合性,而Mybatis由于需要手写sql,因此与数据库的耦合性直接取决于程序员写sql的方法,如果sql不具通用性而用了很多某数据库特性的sql语句的话,移植性也会随之降低很多,成本很高。

3、Hibernate拥有完整的日志系统,Mybatis则欠缺一些。

Hibernate日志系统非常健全,涉及广泛,包括:sql记录、关系异常、优化警告、缓存提示、脏数据警告等;而Mybatis则除了基本记录功能外,其它功能都薄弱很多。

4、sql直接优化上,Mybatis要比Hibernate方便很多。

由于Mybatis的sql都是写在xml里,因此优化sql比Hibernate方便很多。而Hibernate的sql很多都是自动生成的,无法直接维护sql;虽有HQL,但功能还是不及sql强大,也就是说HQL是有局限的;Hibernate虽然也支持原生sql,但开发模式上却与orm不同,需要转换思维,因此使用上不是非常方便。总之写sql的灵活度上Hibernate不及Mybatis。

8、 介绍一下Hibernate的缓存。

一、Hibernate缓存的作用:

Hibernate是一个持久层框架,经常访问物理数据库,为了降低应用程序对物理数据源访问的频次,从而提高应用程序的运行性能。缓存内的数据是对物理数据源中的数据的复制,应用程序在运行时从缓存读写数据,在特定的时刻或事件会同步缓存和物理数据源的数据

二、Hibernate缓存分类:

Hibernate缓存包括两大类:Hibernate一级缓存和Hibernate二级缓存。

Hibernate一级缓存又称为“Session的缓存”,它是内置的,意思就是说,只要你使用hibernate就必须使用session缓存。由于Session对象的生命周期通常对应一个数据库事务或者一个应用事务,因此它的缓存是事务范围的缓存。在第一级缓存中,持久化类的每个实例都具有唯一的OID。

Hibernate二级缓存又称为“SessionFactory的缓存”,由于SessionFactory对象的生命周期和应用程序的整个过程对应,因此Hibernate二级缓存是进程范围或者集群范围的缓存,有可能出现并发问题,因此需要采用适当的并发访问策略,该策略为被缓存的数据提供了事务隔离级别。第二级缓存是可选的,是一个可配置的插件,在默认情况下,SessionFactory不会启用这个插件。Hibernate内置支持的二级缓存组件重用的有:EHCache,OSCache等。如果想用应用二级缓存,需要在hibernate.cfg.xml文件中进行配置。

9、 说一说Servlet的生命周期?

servlet 有良好的生命周期的定义,包括加载和实例化、初始化、处理请求以及服务结束。

这个生命周期由javax.servlet.Servlet接口的init,service和destroy方法表达。

Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doXXX方法(doGet,doPost)等,

当服务器决定将实例销毁的时候调用其destroy方法。

web容器加载servlet,生命周期开始。通过调用servlet的init()方法进行servlet的初始化。通过调用service()方法实现,根据请求的不同调用不同的do***()方法。

结束服务,web容器调用servlet的destroy()方法。

10、 jsp有哪些内置对象?作用分别是什么?

JSP共有以下9个内置的对象:

request  :用户端请求,此请求会包含来自GET/POST请求的参数。

response  :网页传回用户端的回应

pageContext  :网页的属性是在这里管理

session :与请求有关的会话期

application :servlet 正在执行的内容

out :用来传送回应的输出

config:servlet的构架部件

page:JSP网页本身

exception:针对错误网页,未捕捉的例外

11、 JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么?

JSP和Servlet的区别:

1、Jsp是Servlet的一种简化,使用Jsp只需要完成程序员需要输出到客户端的内容。

Jsp经编译后就变成了Servlet.(JSP的本质就是Servlet,JVM只能识别java的类,不能识别JSP的代码,Web容器将JSP的代码编译成JVM能够识别的java类)。

2、Jsp更擅长表现于页面显示,Servlet更擅长于逻辑控制。

3、Servlet是个完整的Java类,这个类的Service方法用于生成对客户端的响应。

联系:JSP是Servlet技术的扩展,本质上就是Servlet的简易方式。JSP编译后是“类servlet”。

总结:Servlet和JSP最主要的不同点在于:Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML里分离开来。

而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件。

JSP侧重于视图,Servlet主要用于控制逻辑。

12、 HTTP请求中GET与POST方式的区别。

一、本质区别:Get是向服务器发索取数据的一种请求,而Post是向服务器提交数据的一种请求。

二、安全性:get方式安全性低,post方式较安全。但是post方式执行效率要比get方式差一些。

三、机制:get是把参数数据队列加到提交表单的action属性所指的URL的后面,在URl中,值和表单中各个字段一一对应,并且这些在URl中对用户来说是可见的。

post 是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到action属性所指的URL地址,对于用户来说,这是不可见的。

总结:

1、get方式的安全性较post方式要差一些,所以,包含一些重要的信息的话,简易使用post数据提交方式。

2、在做查询统计的时候,使用get方式要更好一些;而在做数据的添加,修改或删除操作时,建议使用post数据提交方式。

13、 Tomcat的优化经验。

Tomcat默认参数是为开发环境制定,而非适合生产环境,尤其是内存和线程的配置,默认都很低,容易成为性能瓶颈。

主要从以下三个方面优化:

1、tomcat内存优化:

linux修改TOMCAT_HOME/bin/catalina.sh,在前面加入JAVA_OPTS="-XX:PermSize=64M -XX:MaxPermSize=128m -Xms512m -Xmx1024m -Duser.timezone=Asia/Shanghai"

windows修改TOMCAT_HOME/bin/catalina.bat,在前面加入set JAVA_OPTS=-XX:PermSize=64M -XX:MaxPermSize=128m -Xms512m -Xmx1024m

最大堆内存是1024m,对于现在的硬件还是偏低,实施时,还是按照机器具体硬件配置优化。

2、tomcat 线程优化:confservice.xml中

<Connector port="80" protocol="HTTP/1.1" maxThreads="600" minSpareThreads="100" maxSpareThreads="500" acceptCount="700"

connectionTimeout="20000" redirectPort="8443" />

maxThreads="600" //最大线程数

minSpareThreads="100"//初始化时创建的线程数

maxSpareThreads="500"//一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程。

acceptCount="700"//指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理

3、设置session过期时间

confweb.xml中通过参数指定:

<session-config>  

<session-timeout>180</session-timeout>

</session-config>    180 单位为分钟。

14、 谈谈Ajax的技术组成与核心原理。

AJax特点:局部刷新页面、提高用户的体验度,数据从服务器端加载。页面在不刷新的情况下直接进行后台数据的交互,可以把以前一些服务器负担的工作转嫁到客户端,利用客户端闲置的能力来处理,减轻服务器和网络的负担,节约空间和网络的租用成本。并且减轻服务器的负担,

ajax的原则是“按需取数据”(就是需要什么会去自加载什么),可以最大程度的减少繁复请求,和响应对服务器造成的负担。异步(发送请求以后不等结果,由回调函数处理)

15、 说说Cookie和Session的作用以及区别。

一、Cookie 的工作原理:

Cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。

Cookie的内容主要包括:名字,值,过期时间,路径和域。路径与域一起构成Cookie的作用范围。若不设置过期时间,则表示这个Cookie的生命期为浏览器会话期间,关闭浏览器窗口,Cookie就消失。这种生命期为浏览器会话期的Cookie被称为会话Cookie。会话Cookie一般不存储在硬盘上而是保存在内存里。若设置了过期时间,浏览器就会把Cookie保存到硬盘上,关闭后再次打开浏览器,这些Cookie仍然有效直到超过设定的过期时间。存储在硬盘上的Cookie可以在不同的浏览器进程间共享,比如两个IE窗口。而对于保存在内存里的Cookie,不同的浏览器有不同的处理方式。

二、Session

Session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构来保存信息。

当客户端请求服务器时候,服务器首先检查这个客户端的请求里是否已包含了一个session标识(称为session id),如果已包含则说明以前已经为此客户端创建过session,服务器就按照session id把这个session检索出来使用,如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相关联的session id,将这个session id在本次响应中返回给客户端保存。

三、Cookie 和Session 的区别:

1、cookie数据存放在客户的浏览器上,session数据放在服务器上。

2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,考虑到安全应当使用session。

3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能考虑到减轻服务器性能方面,应当使用COOKIE。

4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。

5、所以个人建议:将登陆信息等重要信息存放为SESSION 其他信息如果需要保留,可以放在COOKIE中。

16、 Java中常用的设计模式?说明工厂模式?

一、Java中的23种设计模式:

Factory(工厂模式),Proxy(代理模式),Singleton(单例模式),Template Method(模板方法模式)等等

(注:其中最重用的有工厂模式、代理模式和单例模式)。

一, 单例模式:基本概念:保证一个类仅有一个实例,并提供一个访问它的全局访问点

二、工厂模式:基本概念:为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的

  • 简单工厂模式Simple Factory:不利于产生系列产品;
  • 工厂方法模式Factory Method:又称为多形性工厂;
  • 抽象工厂模式Abstract Factory:又称为工具箱,产生产品族,但不利于产生新的产品;

 

工厂模式是一种经常被使用到的模式,根据工厂模式实现的类可以根据提供的数据生成一组类中某一个类的实例,通常这一组类有一个公共的抽象父类并且实现了相同的方法,但是这些方法针对不同的数据进行了不同的操作。首先需要定义一个基类,该类的子类通过不同的方法实现了基类中的方法。

三:建造(Builder)模式

基本概念:是一种对象构建的设计模式,它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象。

Builder模式是一步一步创建一个复杂的对象,它允许用户可以只通过指定复杂对象的类型和内容就可以构建它们。用户不知道内部的具体构建细节。Builder模式是非常类似抽象工厂模式,细微的区别大概只有在反复使用中才能体会到

 

17、谈谈Nginx服务器。

Nginx不仅是一个小巧且高效的HTTP服务器,也可以做一个高效的负载均衡反向代理,通过它接受用户的请求并分发到多个Mongrel进程可以极大提高Rails应用的并发能力。

18、 WebService是什么?

一、Web service 就是一个应用程序,它向外界暴露出一个能够通过Web进行调用的API。这就是说,你能够用编程的方法通过Web来调用这个应用程序。我们把调用这个Web service 的应用程序叫做客户。Web Service减少了应用接口的花费。Web Service为整个企业甚至多个组织之间的业务流程的集成提供了一个通用机制。

19、怎么解决线程同步

同步是指同一时间段内只能运行一个线程,其他线程需要等待此线程完成后才可继续执行。同步可以解决线程中资源共享的安全问题,主要通过同步代码块和同步方法两种方式完成。

1.1 同步代码块

在Java程序中,代码块是指使用“{}”括起来的一段代码。代码块前添加了synchronized关键字即为同步代码块。同步代码块格式如下:Synchronized(同步对象){   //需要同步的代码}

1.2 同步方法

同步方法是指使用synchronized关键字声明方法,即为方法加上资源访问锁,同一时间只允许一个线程调用同步方法,其他线程必须等待当前线程调用结束后才能调用同步方法。

2. 总结

Ø 线程是比进程更小的执行单位,是在进程的基础上进行的进一步划分。所谓多线程是指一个进程在执行过程中可以产生多个线程。

Ø Java中实现多线程有两种方式:继承Thread类和实现Runnable接口,前者不适合多个线程共享资源,而后者可以方便地实现资源共享。

Ø 解决线程中资源共享的安全问题可以使用同步代码块和同步方法实现。

Ø 线程在整个生命周期中具有创建、就绪、运行、阻塞和终止5中状态。

20、谈谈Quartz任务调度

Quartz框架是一个开源的企业级任务调度服务,已经被作为任务调度的良好解决方案。

Quartz框架核心概念

Quartz对任务调度进行了高度抽象,提出了3个核心概念,并在org.quartz包中通过接口和类进行了描述

任务:就是执行的工作内容。Quartz提供Job接口来支持任务定义

触发器:定义触发Job执行的时间触发规则。Quartz提供Trigger类及其子类支持触发器功能,

调度器:Quartz提供了Scheduler接口,将工作任务和触发器绑定,保证任务可以在正确的时间执行

实现Quartz任务调度的步骤:

1,定义任务,通过实现org.quartz.Job接口,可以使java类变成可调度的任务。

重写该接口中的一个方法,void execute(JobExecutionContext context),实现该接口来定义需要执行的任务

2,创建触发器,触发器,它用于定义Job何时执行。最常用的是SimpleTrigger和CronTrigger。一般来说,如果你需要在一个固定的时间和重复次数或者一个固定的间隔时间,那么SimpleTrigger比较合适;如果你有许多复杂的作业调度,那么CronTrigger比较合适。

3,创建对应的调度器

21、说说DOM4J怎么使用的

dom4j是一个Java的XML API,类似于jdom,用来读写XML文件的,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件。

DOM4J的使用步骤:

1, 获得Document对象

2, 节点相关操作

3, 属性相关操作

4, 将文档写入XML文件

5, 字符串与XML的转换

22、说一下你了解的shiro框架

Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。

主要功能有三个核心组件:Subject, SecurityManager 和 Realms.

Subject:即“当前操作用户”。但是,在Shiro中,Subject这一概念并不仅仅指人,也可以是第三方进程、后台帐户(Daemon Account)或其他类似事物。它仅仅意味着“当前跟软件交互的东西”。但考虑到大多数目的和用途,你可以把它认为是Shiro的“用户”概念。Subject代表了当前用户的安全操作。

SecurityManager:它是Shiro框架的核心,典型的Facade模式,Shiro通过SecurityManager来管理内部组件实例,并通过它来提供安全管理的各种服务。
  Realm: Realm充当了Shiro与应用安全数据间的“桥梁”或者“连接器”。也就是说,当对用户执行认证(登录)和授权(访问控制)验证时,Shiro会从应用配置的Realm中查找用户及其权限信息。可以配置多个Realm,但是至少需要一个。

23、讲讲你了解的WebSocket

WebSocket协议是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工(full-duplex)通信——允许服务器主动发送信息给客户端。

http协议: HTTP的生命周期通过Request来界定,也就是一个Request 一个Response,那么HTTP1.0,这次HTTP请求就结束了。但是请记住 Request = Response , 在HTTP中永远是这样,也就是说一个request只能有一个response。而且这个response也是被动的,不能主动发起

Websocket是什么样的协议,具体有什么优点

首先Websocket是基于HTTP协议的,或者说借用了HTTP的协议来完成一部分握手。在握手阶段是一样的他解决了HTTP的这几个难题。

被动性,当服务器完成协议升级后(HTTP->Websocket),服务端就可以主动推送信息给客户端啦。只需要经过一次HTTP请求,就可以做到源源不断的信息传送了。(在程序设计中,这种设计叫做回调,即:你有信息了再来通知我,而不是我傻乎乎的每次跑来问你)

Websocket就解决了这样一个难题,(在传统的方式上,要不断的建立,关闭HTTP协议,由于HTTP是非状态性的,每次都要重新传输identity info(鉴别信息),来告诉服务端你是谁。)建立后,可以直接跟服务器建立持久连接,有信息的时候服务器主动响应客户端 Websocket只需要一次HTTP握手,所以说整个通讯过程是建立在一次连接/状态中,也就避免了HTTP的非状态性,服务端会一直知道你的信息,直到你关闭请求,

至于怎么在不支持Websocket的客户端上使用Websocket。。答案是:不能
但是可以通过long poll 和 ajax 轮询来 模拟出类似的效果

24、谈谈你所了解的logback

简单地说,Logback 是一个 Java 领域的日志框架。它被认为是 Log4J 的继承人。
Logback 主要由三个模块组成:logback-core、logback-classic、logback-access

logback-core 是其它模块的基础设施,其它模块基于它构建,显然,logback-core 提供了一些关键的通用机制。

logback-classic 的地位和作用等同于 Log4J,它也被认为是 Log4J 的一个改进版,并且它实现了简单日志门面 SLF4J

logback-access 主要作为一个与 Servlet 容器交互的模块,比如说 tomcat 或者 jetty,提供一些与 HTTP 访问相关的功能。

Logback与Log4J的区别:

  • 同样的代码路径,Logback 执行更快
  • 原生实现了 SLF4J API(Log4J 还需要有一个中间转换层)
  • 更充分的测试
  • 内容更丰富的文档
  • 配置文件自动热加载
  • 从 IO 错误中优雅恢复
  • 自动删除日志归档
  • 支持配置文件中加入条件判断来适应不同的环境

25、什么是中间件

中间件是一种独立的系统软件或服务程序,分布式应用软件借助这种软件在不同的技术之间共享资源,中间件位于客户机服务器的操作系统之上,管理计算资源和网络通信。

  • 1, 中间件的特征(平台化,应用支撑,软件复用,耦合关系,互操作性)
  • 2,中间件的分类(应用服务类中间件,应用集成类中间件,业务架构类中间件)

26、说说你了解的MQ

MQTT是IBM开发的一个基于二进制消息的发布/订阅编程模式的消息通讯协议。mq是通讯中间件。他的作用是省去开发人员开发通讯工具的时间,节省开发成本,提高开发效率。

mq中一些名称的概念:
队列管理器:简单的说就是一个大容器的管理员,这个大容器里放了很多东西。
队列:大容器里的东西,存放消息的盒子。
通道:大容器和大容器之间,程序和容器之间进行通讯的途径。

MQTT提供三种质量的服务,对重传的控制:

1)至多一次,可能会出现丢包的现象。使用在对实时性要求不高的情况。这一级别可应用于如下情景,如环境传感器数据,丢失一次读记录无所谓,因为很快下一次读记录就会产生。

2)至少一次,保证包会到达目的地,但是可能出现重包。

3)正好一次,保证包会到达目的地,且不会出现重包的现象。这一级别可用于如计费系统等场景,在计费系统中,消息丢失或重复可能会导致生成错误的费用。

mq的通讯方式有两种,通俗的说就是mq之间进行通讯,开发的程序和mq之间的通讯。

  • 通过发送接收通道建立tcp连接进行消息传输,称为server对server
  • 通过服务器连接通道进行传输,client对server

Mq实现通讯的步骤:

1,        首先要规划好两个队列管理器之间使用的ip和端口

2,           建立队列管理器

3,           启动队列管理器

4,           定义队列管理器中的队列和通道

5,           配置监听器

6,           配置另外一个队列管理器

7,           测试是否正常传输

27、HttpClient

HttpClient相比传统JDK自带的URLConnection,增加了易用性和灵活性(具体区别,日后我们再讨论),它不仅是客户端发送Http请求变得容易,而且也方便了开发人员测试接口(基于Http协议的),即提高了开发的效率,也方便提高代码的健壮性。因此熟练掌握HttpClient是很重要的必修内容,掌握HttpClient后,相信对于Http协议的了解会更加深入。

特性

1. 基于标准、纯净的java语言。实现了Http1.0和Http1.1

2. 以可扩展的面向对象的结构实现了Http全部的方法(GET, POST, PUT, DELETE, HEAD, OPTIONS, and TRACE)。

3. 支持HTTPS协议。

4. 通过Http代理建立透明的连接。

5. 利用CONNECT方法通过Http代理建立隧道的https连接。

6. Basic, Digest, NTLMv1, NTLMv2, NTLM2 Session, SNPNEGO/Kerberos认证方案。

7. 插件式的自定义认证方案。

8. 便携可靠的套接字工厂使它更容易的使用第三方解决方案。

9. 连接管理器支持多线程应用。支持设置最大连接数,同时支持设置每个主机的最大连接数,发现并关闭过期的连接。

10. 自动处理Set-Cookie中的Cookie。

11. 插件式的自定义Cookie策略。

12. Request的输出流可以避免流中内容直接缓冲到socket服务器。

13. Response的输入流可以有效的从socket服务器直接读取相应内容。

14. 在http1.0和http1.1中利用KeepAlive保持持久连接。

15. 直接获取服务器发送的response code和 headers。

16. 设置连接超时的能力。

17. 实验性的支持http1.1 response caching。

18. 源代码基于Apache License 可免费获取。

使用方法

使用HttpClient发送请求、接收响应很简单,一般需要如下几步即可。

1. 创建HttpClient对象。

2. 创建请求方法的实例,并指定请求URL。如果需要发送GET请求,创建HttpGet对象;如果需要发送POST请求,创建HttpPost对象。

3. 如果需要发送请求参数,可调用HttpGet、HttpPost共同的setParams(HetpParams params)方法来添加请求参数;对于HttpPost对象而言,也可调用setEntity(HttpEntity entity)方法来设置请求参数。

4. 调用HttpClient对象的execute(HttpUriRequest request)发送请求,该方法返回一个HttpResponse。

5. 调用HttpResponse的getAllHeaders()、getHeaders(String name)等方法可获取服务器的响应头;调用HttpResponse的getEntity()方法可获取HttpEntity对象,该对象包装了服务器的响应内容。程序可通过该对象获取服务器的响应内容。

6. 释放连接。无论执行方法是否成功,都必须释放连接(大量请求访问时就必然会造成链接被占满,请求等待的情况)

28、java操作excle表格

Java 操作 Excel 最常用的就是JXL(Java excel api)和POI,用起来挺简单的,不过相应的其功能也并非很强大,够用就行

jxl是一个韩国人写的java操作excel的工具, 在java的开源世界中,有两套比较有影响的API可供使用,一个是POI,一个是jExcelAPI(即jxl)。jxl功能相对POI比较弱一点。

但jxl对中文支持非常好,API是纯Java的, 不依赖Windows系统,即使运行在Linux下,也同样能够正确的处理Excel文件。 需要补充说明的是,jxl对图形和图表的支持很有限,而且 仅仅识别PNG格式的图片

 使用jxl.jar

1.创建工作簿对象

WritableWorkbook workbook = Workbook.createWorkbook(new File("d:/AA/test.xls"));

// 创建新的一页

WritableSheet sheet = workbook.createSheet("First Sheet", 0);

2. 常用操作页面方法“

WritableSheet sheet = workbook.getSheet(0); 获取第一页

Sheet.setName() 设置sheet名

workbook.removeSheet(2); // 移除多余的标签页

    sheet.mergeCells(0, 0, 4, 0); // 合并单元格,第一个参数是起始列,第二个参数是起始行,第三个参数是终止列,第四个参数是终止行

sheet.setRowView(0, 600); // 设置行的高度 

sheet.setColumnView(0, 30); // 设置列的宽度

把创建的内容写入到输出流中,并关闭输出流

workbook.write();

workbook.close();

os.close();

使用 poi

  • 1
  • 2
  • 3

7Jsoup

jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。

在爬虫采集网页领域主要作用是用HttpClient获取到网页后具体的网页提取需要的信息的时候,就用到Jsoup,Jsoup可以使用强大的类似Jquery,css选择器,来获取需要的数据。

使用简介:   

String content = EntityUtils.toString(“实体对象“, "utf-8");

        Document document = Jsoup.parse(content);//解析html返回doc对象

//根据标签获取内容

       Elements elementsByTag = document.getElementsByTag("title");//获取所有title标签

       Element element = elementsByTag.get(0);//获取第0个title标签

       String text = element.text();//返回元素的文本

       System.out.println("网页标题为:"+text);

      

       //根据id获取内容

       Element elementById = document.getElementById("site_nav_top");

       String text2 = elementById.text();

       System.out.println("网页口号为:"+text2);

       HttpClientUtils.closeHttpClient();

HTTP 简介:

http协议:HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议

HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等

HTTP之URL

HTTP使用统一资源标识符(Uniform Resource Identifiers, URI)来传输数据和建立连接。URL是一种特殊类型的URI,包含了用于查找某个资源的足够的信息

URL,全称是UniformResourceLocator, 中文叫统一资源定位符,是互联网上用来标识某一处资源的地址。以下面这个URL为例,介绍下普通URL的各部分组成:

http://www.aspxfans.com:8080/news/index.asp?boardID=5&ID=24618&page=1#name

从上面的URL可以看出,一个完整的URL包括以下几部分:
1.协议部分:该URL的协议部分为“http:”,这代表网页使用的是HTTP协议。在Internet中可以使用多种协议,如HTTP,FTP等等本例中使用的是HTTP协议。在"HTTP"后面的“//”为分隔符

2.域名部分:该URL的域名部分为“www.aspxfans.com”。一个URL中,也可以使用IP地址作为域名使用

3.端口部分:跟在域名后面的是端口,域名和端口之间使用“:”作为分隔符。端口不是一个URL必须的部分,如果省略端口部分,将采用默认端口

4.虚拟目录部分:从域名后的第一个“/”开始到最后一个“/”为止,是虚拟目录部分。虚拟目录也不是一个URL必须的部分。本例中的虚拟目录是“/news/”

5.文件名部分:从域名后的最后一个“/”开始到“?”为止,是文件名部分,如果没有“?”,则是从域名后的最后一个“/”开始到“#”为止,是文件部分,如果没有“?”和“#”,那么从域名后的最后一个“/”开始到结束,都是文件名部分。本例中的文件名是“index.asp”。文件名部分也不是一个URL必须的部分,如果省略该部分,则使用默认的文件名

6.锚部分:从“#”开始到最后,都是锚部分。本例中的锚部分是“name”。锚部分也不是一个URL必须的部分

7.参数部分:从“?”开始到“#”为止之间的部分为参数部分,又称搜索部分、查询部分。本例中的参数部分为“boardID=5&ID=24618&page=1”。参数可以允许有多个参数,参数与参数之间用“&”作为分隔符。

Java操作图片

  加载图片:

  1. 先得到通过路径得到要修改的图片。

final BufferedImage image = ImageIO.read(图片路径);  

Graphics2D g= image . createGraphics();//获取图片流 使用Graphics2D类接收

  添加文字:

样式字体的设置和文字的编写。

  1. Graphics g = image.getGraphics();   
  2. g.setFont(new Font("微软雅黑",Font.BOLD ,48));//设置字体  
  3. g.setColor(Color.red);//设置颜色  
  4. g.drawString(文字, x坐标, y坐标);//文字的编写及位置

g.dispose();  

Graphics2D类:

Graphics2D ,Graphics 类,提供了对几何形状、坐标转换、颜色管理和文本布局更为复杂的控制。它是用于在 Java(tm) 平台上呈现二维形状、文本和图像的基础类。验证码生成可以用到此类。

public abstract class Graphics2Dextends Graphics 此 Graphics2D 类扩展了 Graphics 类,提供了对几何形状、坐标转换、颜色管理和文本布局更为复杂的控制

使用简介:

以下代码在点(3,3)与点(50,50)之间画线段,在点(100,100)处画一个点。

   g.drawLine(3,3,50,50);//画一条线段

   g.drawLine(100,100,100,100);//画一个点。

oracle 面试常见问题:
1.事务概念:事务是这样一种机制,它确保多个SQL语句被当作单个工作单元来处理。

用户定义的一个数据库操作序列,这些操作要么全部成功完成要么全部不做,是一个不可分割的整体。定义事务的SQL语句有:BEGIN TRANSACTION,COMMIT,ROLLBACK。 

事务的一致性:是事务原子性的体现,事务所对应的数据库操作要么成功要么失败没有第三种情况。事务不管是提交成功与否都不能影响数据库数据的一致性状态。 
事务的原子性:就是事务所包含的数据库操作要么都做,要么都不做. 
事务的隔离性:事务对数据的操作不能够受到其他事务的影响。 
事务的持续性:也就是说事务对数据的影响是永久的

2. view 的概念 ? 何时应用?

view 是对表级数据的多角度的透视,适用于对查询安全性、灵活性有一定要求的环境.

3. 介绍一下oracle的体系结构?

逻辑体系结构:块,区,段,表空间 
  物理体系结构:表空间,三大文件 
  软件体系结构:SGA,后台进程.

11 介绍一下oracle的体系结构?

  逻辑体系结构:块,区,段,表空间 
      物理体系结构:表空间,三大文件 
      软件体系结构:SGA,后台进程.

013 简述ORACLE的启动和关闭各有多少步骤?

  启动:启动实例、装载数据库数据、打开数据库。 关闭:关闭数据库、卸载数据库数据、关闭实例。

014 ORACLE数据库都有哪些类型的文件?

  数据文件,控制文件,日志文件,参数文件

015 Oracle中,你所创建的表空间信息放在哪里?

  存放在数据字典中,数据字典内容对应于系统表空间SYSTEM表空间。

016 ORACLE的基本数据类型有哪些?

Char()存储定长字符,定义的时候可以不为他指定长度但是如若往里插入值则会出错;varchar2()存储变长字符定义的时候必须指定长度,date存储时间日期;Number()数字类型,包括整型,浮点型等;clob()大容量字符串;blob()大二进制对象

Oracle语法中truncatedelete的区别?

1. TRUNCATE在各种表上无论是大的还是小的都非常快。如果有ROLLBACK命令DELETE将被撤销,而TRUNCATE则不会被撤销。 
  2. TRUNCATE是一个DDL语言而DELETE是DML语句,向其他所有的DDL语言一样,他将被隐式提交,不能对TRUNCATE使用ROLLBACK命令。 
  3. TRUNCATE将重新设置高水平线和所有的索引。在对整个表和索引进行完全浏览时,经过TRUNCATE操作后的表比DELETE操作后的表要快得多。 
  4. TRUNCATE不能触发触发器,DELETE会触发触发器。 
  5. 不能授予任何人清空他人的表的权限。 
  6. 当表被清空后表和表的索引讲重新设置成初始大小,而delete则不能。 
  7. 不能清空父表。

Oracle中的异常有哪几类?

oracle中有三种类型的异常。预定义的异常 非预定义的异常 用户定义的异常 其中第二种非预定义的异常是与特定的oracle错误关联。

使用索引查询一定能提高查询的性能吗?为什么?

通常,通过索引查询数据比全表扫描要快.但是我们也必须注意到它的代价. 索引需要空间来存储,也需要定期维护, 每当有记录在表中增减或索引列被修改时,索引本身也会被修改. 这意味着每条记录的INSERT,DELETE,UPDATE将为此多付出4,5 次的磁盘I/O. 因为索引需要额外的存储空间和处理,那些不必要的索引反而会使查询反应时间变慢.使用索引查询不一定能提高查询性能,索引范围查询(INDEX RANGE SCAN)适用于两种情况: 
  基于一个范围的检索,一般查询返回结果集小于表中记录数的30%宜采用; 
  基于非唯一性索引的检索,索引就是为了提高查询性能而存在的,如果在查询中索引没有提高性能,只能说是用错了索引,或者讲是场合不同

 回滚段的作用是什么?

  回滚段用于保存数据修改前的映象,这些信息用于生成读一致性数据库信息、在数据库恢复和Rollback时使用。一个事务只能使用一个回滚段。 
  事务回滚:当事务修改表中数据的时候,该数据修改前的值(即前影像)会存放在回滚段中,当用户回滚事务(ROLLBACK)时,ORACLE将会利用回滚段中的数据前影像来将修改的数据恢复到原来的值。 
  事务恢复:当事务正在处理的时候,例程失败,回滚段的信息保存在undo表空间中,ORACLE将在下次打开数据库时利用回滚来恢复未提交的数据。 
  读一致性:当一个会话正在修改数据时,其他的会话将看不到该会话未提交的修改。 当一个语句正在执行时,该语句将看不到从该语句开始执行后的未提交的修改(语句级读一致性) 当ORACLE执行SELECT语句时,ORACLE依照当前的系统改变号(SYSTEM CHANGE NUMBER-SCN) 来保证任何前于当前SCN的未提交的改变不被该语句处理。可以想象:当一个长时间的查询正在执行时, 若其他会话改变了该查询要查询的某个数据块,ORACLE将利用回滚段的数据前影像来构造一个读一致性视图

SGA主要有那些部分,主要作用是什么

系统全局区(SGA:是ORACLE为实例分配的一组共享缓冲存储区,用于存放数据库数据和控制信息,以实现对数据库数据的管理和操作。 SGA主要包括: 
  1. 共享池(shared pool) :用来存储最近执行的SQL语句和最近使用的数据字典的数据。 
  2. 数据缓冲区 (database buffer cache):用来存储最近从数据文件中读写过的数据。 
  3. 重作日志缓冲区(redo log buffer:用来记录服务或后台进程对数据库的操作。 另外在SGA中还有两个可选的内存结构: 
  4. Java pool: 用来存储Java代码。 
  5. Large pool: 用来存储不与SQL直接相关的大型内存结构。备份、恢复使用。

Oracle系统进程主要有哪些,作用是什么

数据写进程(DBWR):负责将更改的数据从数据库缓冲区高速缓存写入数据文件 
  日志写进程(LGWR):将重做日志缓冲区中的更改写入在线重做日志文件 
  系统监控 (SMON): 检查数据库的一致性如有必要还会在数据库打开时启动数据库的恢复 
  进程监控 (PMON): 负责在一个Oracle 进程失败时清理资源 
  检查点进程(CKPT):负责在每当缓冲区高速缓存中的更改永久地记录在数据库中时,更新控制文件和数据文件中的数据库状态信息。 
  归档进程 (ARCH):在每次日志切换时把已满的日志组进行备份或归档 
  恢复进程 (RECO): 保证分布式事务的一致性,在分布式事务中,要么同时commit,要么同时rollback

Oracle索引分为哪几类,说出唯一索引和位图索引的概念。

  Oracle索引有B树索引,位图索引,函数索引,簇索引等。 
  唯一索引也是B树索引的一种,它要求被索引的字段值不可以重复。在创建的时候使用B树算法创建。 
  位图索引并不是采用像唯一索引那样存储(索引字段值,记录ROWID)来创建索引段的,而是为每一个唯一的字段值创建一个位图,位图中使用位元来对应一个记录的ROWID。位元到ROWID是通过映射的到的。

oracle 优势:

1、处理速度快,非常快
2、安全级别高。支持快闪以及完美的恢复,即使硬件坏了 也可以恢复到故障发前的1s
3、几台数据库做负载数据库,可以做到30s以内故障转移,
4、网格控制,以及 数据仓库方面 也非常强大
缺点:
对硬件的要求很高;
价格比较昂贵;
管理维护麻烦一些;
操作比较复杂,需要技术含量较高;


oracle产品及服务都是付费的,而且价格不菲。比其他数据库要贵,物有所值。oracle不是开源的。不过可以在redhat 或者其他开源操作系统上安装。
mysql在sun没被oracle收购是开源的,免费的,之后oracle公司打算 把mysql打造成不开源,收费模式的。

简单叙述一下MYSQL的优化(重点)

  1.数据库的设计:尽量把数据库设计的更小的占磁盘空间. 
    1) 尽可能使用更小的整数类型.(mediumint就比int更合适). 
    2) 尽可能的定义字段为not null,除非这个字段需要null. 
    3) 如果没有用到变长字段的话比如varchar,那就采用固定大小的纪录格式比如char. 
    4) 表的主索引应该尽可能的短.这样的话每条纪录都有名字标志且更高效. 
    5) 只创建确实需要的索引。索引有利于检索记录,但是不利于快速保存记录。如果总是要在表的组合字段上做搜索,那么就在这些字段上创建索引。索引的第一部分必须是最常使用的字段.如果总是需要用到很多字段,首先就应该多复制这些字段,使索引更好的压缩。 
    6) 所有数据都得在保存到数据库前进行处理。 
    7) 所有字段都得有默认值。 
    8) 在某些情况下,把一个频繁扫描的表分成两个速度会快好多。在对动态格式表扫描以取得相关记录时,它可能使用更小的静态格式表的情况下更是如此。 
  2.系统的用途 
    1) 尽量使用长连接. 
    2) explain复杂的SQL语句。 
    3) 如果两个关联表要做比较话,做比较的字段必须类型和长度都一致. 
    4) LIMIT语句尽量要跟order by或者 distinct.这样可以避免做一次full table scan. 
    5) 如果想要清空表的所有纪录,建议用truncate table tablename而不是delete from tablename. 
    6) 能使用STORE PROCEDURE 或者 USER FUNCTION的时候. 
    7) 在一条insert语句中采用多重纪录插入格式.而且使用load data infile来导入大量数据,这比单纯的insert快好多. 
    8) 经常OPTIMIZE TABLE 来整理碎片. 
    9) 还有就是date 类型的数据如果频繁要做比较的话尽量保存在unsigned int 类型比较快。 
  3.系统的瓶颈 
    1) 磁盘搜索。并行搜索,把数据分开存放到多个磁盘中,这样能加快搜索时间. 
    2) 磁盘读写(IO)。可以从多个媒介中并行的读取数据。 
    3) CPU周期。数据存放在主内存中.这样就得增加CPU的个数来处理这些数据。 
    4) 内存带宽。当CPU要将更多的数据存放到CPU的缓存中来的话,内存的带宽就成了瓶颈.

MySQL和Oracle的区别

(1) 自动增长的数据类型处理 
MYSQL有自动增长的数据类型,插入记录时不用操作此字段,会自动获得数据值。ORACLE没有自动增长的数据类型,需要建立一个自动增长的序列号,插入记录时要把序列号的下一个值赋于此字段。

(2)单引号的处理 
MYSQL里可以用双引号包起字符串,ORACLE里只可以用单引号包起字符串。在插入和修改字符串前必须做单引号的替换:把所有出现的一个单引号替换成两个单引号。

(3)翻页的SQL语句的处理 
MYSQL处理翻页的SQL语句比较简单,用LIMIT 开始位置, 记录个数;PHP里还可以用SEEK定位到结果集的位置。ORACLE处理翻页的SQL语句就比较繁琐了。每个结果集只有一个ROWNUM字段标明它的位置, 并且只能用ROWNUM<100, 不能用ROWNUM>80。

(4) 长字符串的处理 
长字符串的处理ORACLE也有它特殊的地方。INSERT和UPDATE时最大可操作的字符串长度小于等于4000个单字节, 如果要插入更长的字符串, 请考虑字段用CLOB类型,方法借用ORACLE里自带的DBMS_LOB程序包。插入修改记录前一定要做进行非空和长度判断,不能为空的字段值和超出长度字段值都应该提出警告,返回上次操作

(5) 日期字段的处理 
MYSQL日期字段分DATE和TIME两种,ORACLE日期字段只有DATE,包含年月日时分秒信息

(6)空字符的处理 
MYSQL的非空字段也有空的内容,ORACLE里定义了非空字段就不容许有空的内容。按MYSQL的NOT NULL来定义ORACLE表结构, 导数据的时候会产生错误。因此导数据时要对空字符进行判断,如果为NULL或空字符,需要把它改成一个空格的字符串。

(7)字符串的模糊比较 
MYSQL里用 字段名 like ‘%字符串%’,ORACLE里也可以用 字段名 like ‘%字符串%’ 但这种方法不能使用索引, 速度不快,用字符串比较函数 instr(字段名,’字符串’)>0 会得到更精确的查找结果。

一、sqlserver
优点:
易用性、适合分布式组织的可伸缩性、用于决策支持的数据仓库功能、与许多其他服务器软件紧密关联的集成性、良好的性价比等;
为数据管理与分析带来了灵活性,允许单位在快速变化的环境中从容响应,从而获得竞争优势。从数据管理和分析角度看,将原始数据转化为商业智能和充分利用Web带来的机会非常重要。作为一个完备的数据库和数据分析包,SQLServer为快速开发新一代企业级商业应用程序、为企业赢得核心竞争优势打开了胜利之门。作为重要的基准测试可伸缩性和速度奖的记录保持者,SQLServer是一个具备完全Web支持的数据库产品,提供了对可扩展标记语言 (XML)的核心支持以及在Internet上和防火墙外进行查询的能力;

缺点:
开放性 :SQL Server 只能windows上运行没有丝毫开放性操作系统系统稳定对数据库十分重要Windows9X系列产品偏重于桌面应用NT server只适合小型企业而且windows平台靠性安全性和伸缩性非常有限象unix样久经考验尤其处理大数据库;
伸缩性并行性 :SQL server 并行实施和共存模型并成熟难处理日益增多用户数和数据卷伸缩性有限;
安全性:没有获得任何安全证书。
性能 :SQL Server 多用户时性能佳 ;
客户端支持及应用模式: 客户端支持及应用模式。只支持C/S模式,SQL Server C/S结构只支持windows客户用ADO、DAO、OLEDB、ODBC连接;
使用风险:SQL server 完全重写代码经历了长期测试断延迟许多功能需要时间来证明并十分兼容;
二、Oracle
优点:
开放性:Oracle 能所有主流平台上运行(包括 windows)完全支持所有工业标准采用完全开放策略使客户选择适合解决方案对开发商全力支持;
可伸缩性,并行性:Oracle 并行服务器通过使组结点共享同簇工作来扩展windownt能力提供高用性和高伸缩性簇解决方案windowsNT能满足需要用户把数据库移UNIXOracle并行服务器对各种UNIX平台集群机制都有着相当高集成度;
安全性:获得最高认证级别的ISO标准认证。 
性能:Oracle 性能高 保持开放平台下TPC-D和TPC-C世界记录;
客户端支持及应用模式:Oracle 多层次网络计算支持多种工业标准用ODBC、JDBC、OCI等网络客户连接
使用风险:Oracle 长时间开发经验完全向下兼容得广泛应用地风险低

缺点:
对硬件的要求很高;
价格比较昂贵;
管理维护麻烦一些;
操作比较复杂,需要技术含量较高;

三、MySql
优点:
体积小、速度快、总体拥有成本低,开源;
支持多种操作系统;
是开源数据库,提供的接口支持多种语言连接操作
MySql的核心程序采用完全的多线程编程。线程是轻量级的进程,它可以灵活地为用户提供服务,而不过多的系统资源。用多线程和C语言实现的MySql能很容易充分利用CPU;
MySql有一个非常灵活而且安全的权限和口令系统。当客户与MySql服务器连接时,他们之间所有的口令传送被加密,而且MySql支持主机认证;
支持ODBC for Windows, 支持所有的ODBC 2.5函数和其他许多函数, 可以用Access连接MySql服务器, 使得应用被扩展;
支持大型的数据库, 可以方便地支持上千万条记录的数据库。作为一个开放源代码的数据库,可以针对不同的应用进行相应的修改。
拥有一个非常快速而且稳定的基于线程的内存分配系统,可以持续使用面不必担心其稳定性;
MySQL同时提供高度多样性,能够提供很多不同的使用者介面,包括命令行客户端操作,网页浏览器,以及各式各样的程序语言介面,例如C+,Perl,Java,PHP,以及Python。你可以使用事先包装好的客户端,或者干脆自己写一个合适的应用程序。MySQL可用于Unix,Windows,以及OS/2等平台,因此它可以用在个人电脑或者是服务器上;

缺点:
不支持热备份;
MySQL最大的缺点是其安全系统,主要是复杂而非标准,另外只有到调用mysqladmin来重读用户权限时才发生改变;
没有一种存储过程(Stored Procedure)语言,这是对习惯于企业级数据库的程序员的最大限制;
MySQL的价格随平台和安装方式变化。Linux的MySQL如果由用户自己或系统管理员而不是第三方安装则是免费的,第三方案则必须付许可费。Unix或Linux 自行安装 免费 、Unix或Linux 第三方安装 收费

Maven有哪些优点和缺点

优点如下:

简化了项目依赖管理:

易于上手,对于新手可能一个"mvn clean package"命令就可能满足他的工作

便于与持续集成工具(jenkins)整合

便于项目升级,无论是项目本身升级还是项目使用的依赖升级。

有助于多模块项目的开发,一个模块开发好后,发布到仓库,依赖该模块时可以直接从仓库更新,而不用自己去编译。

maven有很多插件,便于功能扩展,比如生产站点,自动发布版本等

缺点如下:

maven是一个庞大的构建系统,学习难度大

maven采用约定优于配置的策略(convention over configuration),虽然上手容易,但是一旦出了问题,难于调试。

当依赖很多时,m2eclipse 老是搞得Eclipse很卡。

中国的网络环境差,很多repository无法访问,比如google code, jboss 仓库无法访问等。

原文地址:https://www.cnblogs.com/czs528/p/13500218.html