java技术面试体汇总:
• struts2和struts1有哪些区别?
1) 在Action实现类方面的对比:
a) Struts 1要求Action类继承一个抽象基类;
b) Struts 2 Action类可以实现一个Action接口,只要一个包含execute方法的POJO类都可以用作Struts 2的Action。
2) 线程模式方面的对比:
a) Struts 1 Action是单例模式并且必须是线程安全的,因此仅有Action的一个实例来处理所有的请求;
b) Struts 2 Action对象为每一个请求产生一个实例,因此没有线程安全问题。
3) Servlet依赖方面的对比:
a) Struts 1 Action依赖于Servlet API,因为Struts 1 Action的execute方法中有HttpServletRequest和HttpServletResponse方法。
b) Struts 2 Action不再依赖于Servlet API
4) 可测性方面的对比:
a) Struts 1 Action依赖于Servlet API,不方便测试
b) Struts 2 Action不再依赖于Servlet API,方便测试
5) 封装请求参数的对比:
a) Struts 1使用ActionForm对象封装用户的请求参数,所有的ActionForm必须继承一个基类:ActionForm。普通的JavaBean不能用作ActionForm。
b) Struts 2提供了ModelDriven模式,可以让开发者使用单独的Model对象来封装用户请求参数,但该Model对象无需继承任何Struts 2基类,是一个POJO
6) 表达式语言方面的对比:
a) Struts1整合了JSTL
b) Struts 2可以使用JSTL,但它整合了一种更强大和灵活的表达式语言:OGNL
7) 绑定值到视图的对比:
a) Struts 1使用标准JSP机制把对象绑定到视图页面;
b) Struts 2使用“ValueStack”技术,使标签库能够访问值,而不需要把对象和视图页面绑定在一起。
• struts2 mvc与spring mvc区别?
1) 配置方面:
a) spring mvc配置可以通过注解方式实现0配置
b) struts2需要采用的传统的配置文件的方式进行配置
2) 性能方面方面:
a) struts2是基于类,struts2框架是类级别的拦截,每次来了请求就创建一个Action,然后调用setter getter方法把request中的数据注入;struts2中,一个Action对象对应一个request上下文。性能较差;
b) spring mvc基于方法,spring3 mvc是方法级别的拦截,拦截到方法后根据参数上的注解,把request数据注入进去,在spring3 mvc中,一个方法对应一个request上下文。
3) 标签库:
a) struts2支持OGNL与JSTL表达式
b) spring mvc只支持EL、JSTL表达式,不支持OGNL表达式
4) 机制:
a) spring mvc的入口是servlet
b) struts2是filter
• Spring IOC和AOP?
IOC
1) 什么是IOC?
IoC就是Inversion of Control,控制反转模式(也称作依赖性介入)的基本概念是:不创建对象,但是描述创建它们的方式。在代码中不直接与对象和服务连接,但在配置文件中描述哪一个组件需要哪一项服务。容器(在 Spring 框架中是 IOC 容器) 负责将这些联系在一起。比如:原来对类的实例是通过类本身new出一个对象,而IOC则是通过容器来实例化对象。
2) 为什么要用IOC?
因为把对象生成放在了XML里定义,所以当我们需要换一个实现子类将会变成很简单,只要修改XML就可以了,这样我们甚至可以实现对象的快速切换。
3) 有什么缺点?
a) 生成一个对象的步骤变复杂了
b) 对象生成因为是使用反射编程,在效率上有些损耗。
c) 缺少IDE重构操作的支持,如果在Eclipse要对类改名,那么你还需要去XML文件里手工去改了,这似乎是所有XML方式的缺憾所在。
AOP
1) 什么是AOP?
AOP就是Aspect Oriented Programming,面向方面编程。是一种编程技术,它允许程序员对横切关注点或横切典型的职责分界线的行为(例如日志和事务管理)进行模块化。AOP 的核心构造是方面,它将那些影响多个类的行为封装到可重用的模块中。
2) 为什么要用AOP?
利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
• XML的解析方式与性能比较?
1.DOM生成和解析XML文档
为 XML 文档的已解析版本定义了一组接口。解析器读入整个文档,然后构建一个驻留内存的树结构,然后代码就可以使用 DOM 接口来操作这个树结构。优点:整个文档树在内存中,便于操作;支持删除、修改、重新排列等多种功能;缺点:将整个文档调入内存(包括无用的节点),浪费时间和空间;使用场合:一旦解析了文档还需多次访问这些数据;硬件资源充足(内存、CPU)。
2.SAX生成和解析XML文档
为解决DOM的问题,出现了SAX。SAX ,事件驱动。当解析器发现元素开始、元素结束、文本、文档的开始或结束等时,发送事件,程序员编写响应这些事件的代码,保存数据。优点:不用事先调入整个文档,占用资源少;SAX解析器代码比DOM解析器代码小,适于Applet,下载。缺点:不是持久的;事件过后,若没保存数据,那么数据就丢了;无状态性;从事件中只能得到文本,但不知该文本属于哪个元素;使用场合:Applet;只需XML文档的少量内容,很少回头访问;机器内存少;
3.DOM4J生成和解析XML文档
DOM4J 是一个非常非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件。如今你可以看到越来越多的 Java 软件都在使用 DOM4J 来读写 XML,特别值得一提的是连 Sun 的 JAXM 也在用 DOM4J。
4.JDOM生成和解析XML
为减少DOM、SAX的编码量,出现了JDOM;优点:20-80原则,极大减少了代码量。使用场合:要实现的功能简单,如解析、创建等,但在底层,JDOM还是使用SAX(最常用)、DOM、Xanan文档。
• Hibernate的优点
1. 对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。
2. Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作
3. hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。
4. hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。
• 面向对象编程思想的特性是什么?
1.抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。(a、数据抽象:就是针对对象的属性,比如建立一个鸟这样的类,鸟会有以下特征,两个翅膀,两支脚,有羽毛等等特性,写成类都是鸟的属性;
b、过程抽象:就是针对对象的行为特征,比如鸟会飞,会跳等等,这些方面的就会抽象为方法,即过程,写成类都是鸟的方法)
2.继承:继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。
3.封装:封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。
4. 多态性:多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多态性(针对方法重载)和包含多态性(针对方法重写)。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。
(重载与重写:方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。Overloaded的方法是可以改变返回值的类型。)
• Extjs原理与优势?
什么是Extjs?
ExtJS是一个用javascript写的,主要用于创建前端用户界面,是一个与后台技术无关的前端ajax框架。因此,可以把ExtJS用在.Net、Java、Php等各种开发语言开发的应用中。
•优点
1、一致的类库
2、实现界面层的MVC编程
3、相对丰富的文档和示例
4、华丽而成熟的界面
•缺点
1、没有合适的开发利器
2、没有界面设计工具
3、文档不全 虽然ExtJS提供的文档很丰富,但是还是跟不上源代码的更新速度,所以,经常要通过看源代码,调试才能真正解决问题。
4、不能编译 这一点可以说是JavaScript的缺点
• Maven的作用?
与Ant区别
1):ant脚本是可以直接运行在maven中的。maven和ant最大的差别就是在于maven的编译以及所有的脚本都有一个基础,就是POM(project object model)。这个模型定义了项目的方方面面,然后各式各样的脚本在这个模型上工作,而ant完全是自己定义,显然maven更胜一筹。
2):Maven对所依赖的包有明确的定义,如使用那个包,版本是多少,一目了然。而ant则通常是简单的inclde 所有的jar。导致的最终结果就是,你根本无法确定JBoss中的lib下的common-logging 是哪个版本的,唯一的方法就是打开 META-INF 目录下MANIFEST.MF。估计JBoss迟早会转向Maven的。
3):Maven是基于中央仓库的编译,即把编译所需要的资源放在一个中央仓库里,如jar,tld,pom,等。当编译的时候,maven会自动在仓库中找到相应的包,如果本地仓库没有,则从设定好的远程仓库中下载到本地。这一切都是自动的,而ant需要自己定义了。这个好处导致的结果就是,用maven编译的项目在发布的时候只需要发布源码,小得很,而反之,ant的发布则要把所有的包一起发布,显然maven又胜了一筹。
4):maven有大量的重用脚本可以利用,如生成网站,生成javadoc,sourcecode reference,等。而ant都需要自己去写。试试 maven site 的效果。
5):maven目前不足的地方就是没有象ant那样成熟的GUI界面,不过mavengui正在努力中。目前使用maven最好的方法还是命令行,又快又方便。
Maven优点:
1、统一管理jar包的版本
2、能进行模块化的打包、编译、部署
3、用大量的重用脚本可以用
Maven缺点:
1、没有成熟的GUI界面
2、由于对jar包进行了版本化的管理,当jar包进行升级或者jar包下载不完整,会出现各种各样jar包依赖错误
• 存储过程的作用与特点?
存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。
优点:
1、与直接执行sql相比存储过程执行效率高。
存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL 语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。
2、升级、维护方便
修改代码需要重新打包部署系统代码,而修改存储过程不需要,只需要在数据库客户端进行修改编译即可。
3、能够缓解网络带宽
java程序对于复杂的sql进行处理,需要多次来回访问远程数据库,增加了网络负担;而封装成存储过程来处理多条sql语句,只需要访问一次数据库。
4、存储过程给底层数据格式增添了额外的抽象层。使得使用存储过程的客户端对存储过程的实现细节以及对底层数据格式是隔离独立的;
5、存储过程单独保护存在于数据库中。客户端可以获取权限执行存储过程,而不需要对底层的具体表设置其他的访问权限;
缺点:
1、可移植性差
公司原来采用sql server开发,后面客户说想要换成Oracle。存储过程改动起来可不是一般的工作量。
2、打破了面向对象编程思想
什么时候该用存储过程?
1、复杂的数据处理用存储过程
如有些生成报表的过程、报表查询。
2、多条件多表联合查询,并做分页处理,用存储过程也比较适合。
3、当在一个事务的完成需要很复杂的商业逻辑时
• Linux系统
•开放性:指系统遵循世界标准规范,特别是遵循开放系统互连(OSI)国际标准。
•多用户:是指系统资源可以被不同用户使用,每个用户对自己的资源(例如:文件、设备)有特定的权限,互不影响
•多任务:它是指计算机同时执行多个程序,而且各个程序的运行互相独立。
•设备独立性:是指操作系统把所有外部设备统一当作成文件来看待,只要安装它们的驱动程序,任何用户都可以象使用文件一样,操纵、使用这些设备,而不必知道它们的具体存在形式。Linux是具有设备独立性的操作系统,它的内核具有高度适应能力。
PS、TOP查看进程
• BIRT特点与工作原理?
1、开发方便快捷,Birt是Eclipse的一个插件可以很好的集成在Eclipse中,图形编辑框架下可以在几分钟之内做出一个报表。
2、可以很方便地在一个报表中混合展现概要数据和详细数据。
3、操作界面友好大方。
4、提供了强大灵活的样式定义,对于熟悉CSS的设计人员来说,应该可以设计出相当出色的报表样式。
5、集成在Eclipse中,不用再开启别报表开发工具窗口,对于习惯于Eclipse开发的程序员来说这点非常重要。
6、Birt的本地化做的很好,安装以后操作界面就是中文的(这点我在使用过程中没有充分体现,我使用了Birt的中文语言包)。
7、开源的报表产品,有源代码,可以进行深层的定制开发。
8、生成的报表完全是XML格式,扩展性好。
9、容易和应用系统结合。
10、最重要一点是开源免费的。
• 多线程的作用和特点?进程与线程的区别?(工厂供电例子)
进程是操作系统结构的基础;是一个正在执行的程序
线程指在程序执行过程中,能够执行程序代码的一个执行单位,每个程序至少都有一个线程,也就是程序本身。
线程的5种状态:新建,就绪,运行,阻塞,死亡。
Thread.sleep:线程 运行状态 转为 阻塞状态。
Thread.yield: 线程 运行状态 转为 就绪状态。
ThreadA.join:等待ThreadA执行完成。
线程的两种方式:
继承自Thread,实现Runnable.
优点:
1、资源利用率更好
2、程序响应更快
是否需要创建多个线程取决于各种因素。在以下情况下,最适合采用多线程处理:
(1)耗时或大量占用处理器的任务阻塞用户界面操作;
(2)各个任务必须等待外部资源 (如远程文件或 Internet连接)。
缺点:
同样的 ,多线程也存在许多缺点 ,在考虑多线程时需要进行充分的考虑。多线程的主要缺点包括:
(1)等候使用共享资源时造成程序的运行速度变慢。这些共享资源主要是独占性的资源 ,如打印机等。
(2)对线程进行管理要求额外的 CPU开销。线程的使用会给系统带来上下文切换的额外负担。当这种负担超过一定程度时,多线程的特点主要表现在其缺点上,比如用独立的线程来更新数组内每个元素。
(3)线程的死锁。即较长时间的等待或资源竞争以及死锁等多线程症状。
(4)对公有变量的同时读或写可能会达不到预期效果。当多个线程需要对公有变量进行写操作时,后一个线程往往会修改掉前一个线程存放的数据,从而使前一个线程的参数被修改;另外 ,当公用变量的读写操作是非原子性时,在不同的机器上,中断时间的不确定性,会导致数据在一个线程内的操作产生错误,从而产生莫名其妙的错误,而这种错误是程序员无法预知的。
• Socket编程原理?TCP/IP 协议?
http://www.cnblogs.com/linzheng/archive/2011/01/23/1942328.html
1、什么是Socket
网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个Socket。Socket通常用来实现客户方和服务方的连接。Socket是TCP/IP协议的一个十分流行的编程界面,一个Socket由一个IP地址和一个端口号唯一确定。
但是,Socket所支持的协议种类也不光TCP/IP一种,因此两者之间是没有必然联系的。在Java环境下,Socket编程主要是指基于TCP/IP协议的网络编程。
1、Socket通讯的过程
Server端Listen(监听)某个端口是否有连接请求,Client端向Server 端发出Connect(连接)请求,Server端向Client端发回Accept(接受)消息。一个连接就建立起来了。Server端和Client 端都可以通过Send,Write等方法与对方通信。
对于一个功能齐全的Socket,都要包含以下基本结构,其工作过程包含以下四个基本的步骤:
(1) 创建Socket;
(2) 打开连接到Socket的输入/出流;
(3) 按照一定的协议对Socket进行读/写操作;
(4) 关闭Socket.(在实际应用中,并未使用到显示的close,虽然很多文章都推荐如此,不过在我的程序中,可能因为程序本身比较简单,要求不高,所以并未造成什么影响。)
• Android
Android:是一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由Google公司和开放手机联盟领导及开发。
Android SDK:SDK:(software development kit)软件开发工具包。被软件开发工程师用于为特定的软件包、软件框架、硬件平台、操作系统等建立应用软件的开发工具的集合。
因此,Android SDK 指的是Android专属的软件开发工具包。
Android运行原理:当我们点击一个应用的时候,系统会自动创建一个相应的activity类实例,然后执行Oncreate方法,接着会执行以下两行代码,解释如下:
super.onCreate(savedInstanceState);一定要执行。完成一些图形的绘制
setContentView(R.layout.main);指定由哪个文件指定布局(main.xml),可以将这个界面显示出来,然后我们进行相关操作,我们的操作会被包装成为一个意图,然后这个意图对应有相关的activity进行处理。
• Tomcat性能优化?
外部优化:
1.JAVA虚拟机性能优化(选择高版本的JDK,设置JVM的内存大小)
2.操作系统性能优化(加内存+硬盘+系统)
3.Tomcat与其它web服务器整合使用(Tomcat+Apache集成,Tomcat处理JSP文件,Apache处理静态文件如:html,css,js)
4.负载均衡
自身优化:
1.停用DNS查询
2,调整线程的数目
3. 预先编译jsp,加快jsp的执行速度
• Servlet生命周期?jsp与servlet的区别?
web容器加载servlet,生命周期开始。通过调用servlet的init()方法进行servlet的初始化。通过调用service()方法实现,根据请求的不同调用不同的do***()方法。结束服务,web容器调用servlet的destroy()方法。
区别:
JSP是Servlet技术的扩展,本质上是Servlet的简易方式,更强调应用的外表表达。JSP编译后是"类servlet"。Servlet和JSP最主要的不同点在于,Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML里分离开来。而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件。JSP侧重于视图,Servlet主要用于控制逻辑。
• 数据库三大范式:
1.第一范式(确保每列保持原子性)
第一范式是最基本的范式。如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库表满足了第一范式。
第一范式的合理遵循需要根据系统的实际需求来定。比如某些数据库系统中需要用到“地址”这个属性,本来直接将“地址”属性设计成一个数据库表的字 段就行。但是如果系统经常会访问“地址”属性中的“城市”部分,那么就非要将“地址”这个属性重新拆分为省份、城市、详细地址等多个部分进行存储,这样在 对地址中某一部分操作的时候将非常方便。这样设计才算满足了数据库的第一范式。
2.第二范式(确保表中的每列都和主键相关)
第二范式在第一范式的基础之上更进一层。第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而 言)。也就是说在一个数据库表中,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中。
3.第三范式(确保每列都和主键列直接相关,而不是间接相关)
第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。
三大范式作用:1、解决数据冗余
2、数据有效性检查
3、提高存储效率。
注意:
规范化也有缺点:由于将一个表拆分成为多个表,在查询时需要多表连接,降低了查询速度。有时候为了查询性能上的考虑,也会违反三大范式的。
• 如何优化数据库?sql语句性能调优的方法有哪些?
1、分割表
2、对于常见的sql或者复杂的sql用存储过程
3、对经常作为查询条件字段建立索引
4、保留冗余列
当两个或多个表在查询中经常需要连接时,可以在其中一个表上增加若干冗余的列,以避免表之间的连接过于频繁。由于对冗余列的更新操作必须对多个表同步进行,所以一般在冗余列的数据不经常变动的情况下使用。
5、增加派生列
派生列是由表中的其它多个列计算所得,增加派生列可以减少统计运算,在数据汇总时可以大大缩短运算时间。
6、sql语句关键字查询优化:
1. NULL 尽量不用IS NULL 与 IS NOT NULL
2. 尽量不用联接列 (first_name||''||last_name)
3. 带通配符(%)的like语句,%不要放在首位查询
4. Order by语句中尽量避免运算
5. 尽量不使用NOT与 <>
6. 用EXISTS代替IN
• 数据库集群与负载均衡
什么是数据库集群?
确切地来说,数据库集群指的是由多个一致并且独立的数据库服务器构成一个逻辑上强大的数据库,它应该同时具备负载均衡、内部实时数据同步、容错和高可用性等功能,还应该对任何原有数据库客户端保持二进制兼容,使得客户端不需要作任何修改就能使用数据库集群。
Oracle RAC集群
SQL Server MSCS集群
双机热备与负载均衡区别在于:
1、双机热备相当于2台服务器其中有一台是另一台的备机,也可以互为备机;主机在运行服务时,备机处于检测状态,主机发生故障后,备机将接管主机的服务
2、负载均衡是在这2台服务器(或N多台)之上增加了一台负载均衡服务器,负载均衡服务器的作用是把用户的请求平均分配到每个节点;增加集群整体的处理能力;实现网络访问的均衡
3、双机热备是为保障24*7小时高可用不停机而推出的产品,而负载均衡是解决服务器压力过大,网络请求大量并发而设计的产品
4、双机热备的优点是:能保障用户服务不间断;负载均衡的优点:WEB访问流畅,用户请求平均分布在每个节点上
5、双机热备缺点:用传统加加阵列的方式增加了存储空间,同样也形成了单点故障;有可能双机热备成为虚设,因为一旦阵列崩溃,服务也意味这停止。
(在条件允许的情况下,可以考虑不加阵列,用软件方式做数据同步,阵列做为备份数据的存储,不失为一个好办法)
6、负载均衡的缺点:适用静态WEB,如果是数据库将不起作用,数据库的多向同步目前还没有完全解决的方案(比如某用户被分配到1号服务器,他在数据库里添加了一条信息;当他下次访问,却被分到2号服务器,那么他原先的数据库信息将不存在)
对于动态的、时常更新的WEB,多向的数据同步也很难,不过我现在已经有了不错的解决办法
因为增加了负载均衡服务器,使得各个节点冗余;但负载均衡器又会形成新的单点故障,所以如果要增加负载均衡设备,一定要选2台做均衡器冗余
负载均衡的优点
• 高可用性:使用群集服务,资源的所有权,如磁盘驱动器和IP地址将自动地从有故障的服务器上,转到可用的服务器上。当群集中的系统或应用程序出现故障时,群集软件将在可用的服务器上,重启失效的应用程序,或将失效节点上的工作,分配到剩余的节点上。结果是,用户只是觉得服务暂时停顿了一下。
• 修复返回:当失效的服务器连回来时,群集服务将自动在群集中平衡负荷。
• 易管理性:可以使用群集管理器来管理群集,(如同在同一个群集中),并管理应用程序(就象它们运行在同一个服务器上)。可以通过拖放群集对象,在群集里的不同服务器移动应用程序。也可以通过同样的方式移动数据。可以通过这种方式来手工地平衡服务器负荷,卸载服务器,从而方便地进行维护。可以从网络的任意地方的节点和资源处,监视群集的状态。
• 可扩展性:群集服务可进行调整,以满足不断增长的需求。当群集的整体负荷超过群集的实际能力时,可以添加额外的节点。
• 什么是sql注入?
所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令。在某些表单中,用户输入的内容直接用来构造(或者影响)动态SQL命令,或作为存储过程的输入参数,这类表单特别容易受到SQL注入式攻击。
如何预防:
1、屏蔽特殊字符或者进行转义
2、使用?号传参,不用字符串拼接方式(使用PreparedStatement,不使用statement)
• 熟悉常用设计模式?
设计模式主要分三个类型:创建型、结构型和行为型。
其中创建型有:
一、Singleton,单例模式:保证一个类只有一个实例,并提供一个访问它的全局访问点
二、Abstract Factory,抽象工厂:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们的具体类。
三、Factory Method,工厂方法:定义一个用于创建对象的接口,让子类决定实例化哪一个类,Factory Method使一个类的实例化延迟到了子类。
四、Builder,建造模式:将一个复杂对象的构建与他的表示相分离,使得同样的构建过程可以创建不同的表示。
五、Prototype,原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型来创建新的对象。
行为型有:
六、Iterator,迭代器模式:提供一个方法顺序访问一个聚合对象的各个元素,而又不需要暴露该对象的内部表示。
七、Observer,观察者模式:定义对象间一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知自动更新。
八、Template Method,模板方法:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,TemplateMethod使得子类可以不改变一个算法的结构即可以重定义该算法得某些特定步骤。
九、Command,命令模式:将一个请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化,对请求排队和记录请求日志,以及支持可撤销的操作。
十、State,状态模式:允许对象在其内部状态改变时改变他的行为。对象看起来似乎改变了他的类。
十一、Strategy,策略模式:定义一系列的算法,把他们一个个封装起来,并使他们可以互相替换,本模式使得算法可以独立于使用它们的客户。
十二、China of Responsibility,职责链模式:使多个对象都有机会处理请求,从而避免请求的送发者和接收者之间的耦合关系
十三、Mediator,中介者模式:用一个中介对象封装一些列的对象交互。
十四、Visitor,访问者模式:表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变各元素类的前提下定义作用于这个元素的新操作。
十五、Interpreter,解释器模式:给定一个语言,定义他的文法的一个表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
十六、Memento,备忘录模式:在不破坏对象的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。
结构型有:
十七、Composite,组合模式:将对象组合成树形结构以表示部分整体的关系,Composite使得用户对单个对象和组合对象的使用具有一致性。
十八、Facade,外观模式:为子系统中的一组接口提供一致的界面,facade提供了一高层接口,这个接口使得子系统更容易使用。
十九、Proxy,代理模式:为其他对象提供一种代理以控制对这个对象的访问
二十、Adapter,适配器模式:将一类的接口转换成客户希望的另外一个接口,Adapter模式使得原本由于接口不兼容而不能一起工作那些类可以一起工作。
二十一、Decrator,装饰模式:动态地给一个对象增加一些额外的职责,就增加的功能来说,Decorator模式相比生成子类更加灵活。
二十二、Bridge,桥模式:将抽象部分与它的实现部分相分离,使他们可以独立的变化。
二十三、Flyweight,享元模式
• 你常用的UML图像?
1、用例图:从用户的角度描述系统功能(用户、测试人员)
2、类框图:描述对象模型中类与类直接的关系(开发人员必须理解的)
3、时序图:描述对象的交互关系:消息发送和接收的过程(执行过程流程)
4、部署图:系统物理组件之间的依赖关系(物理设备,技术支持)
• 面向对象的好处?
活字印刷术:未发明前,诗句只要有一个字错了,就需要重新写。
1、可维护性:诗句只要修改错误的字就可以了,其他的活字不需要改
2、可复用性:诗句中的每个活字可以重复使用
3、可扩展性:诗句中想要加一个字,刻好加进去就可以了
4、灵活性:诗句需要进行横排或者竖排,只要移动活字就可以实现
• 类之间有哪些关系?
关联:类A与类B的实例之间存在特定的对应关系
依赖:类A访问类B提供的服务
聚集:类A为整体类,类B为局部类,类A的对象由类B对象组成
泛化:类A继承类B
实现:类A实现B接口
• struts2和struts1有哪些区别?
1) 在Action实现类方面的对比:
a) Struts 1要求Action类继承一个抽象基类;
b) Struts 2 Action类可以实现一个Action接口,只要一个包含execute方法的POJO类都可以用作Struts 2的Action。
2) 线程模式方面的对比:
a) Struts 1 Action是单例模式并且必须是线程安全的,因此仅有Action的一个实例来处理所有的请求;
b) Struts 2 Action对象为每一个请求产生一个实例,因此没有线程安全问题。
3) Servlet依赖方面的对比:
a) Struts 1 Action依赖于Servlet API,因为Struts 1 Action的execute方法中有HttpServletRequest和HttpServletResponse方法。
b) Struts 2 Action不再依赖于Servlet API
4) 可测性方面的对比:
a) Struts 1 Action依赖于Servlet API,不方便测试
b) Struts 2 Action不再依赖于Servlet API,方便测试
5) 封装请求参数的对比:
a) Struts 1使用ActionForm对象封装用户的请求参数,所有的ActionForm必须继承一个基类:ActionForm。普通的JavaBean不能用作ActionForm。
b) Struts 2提供了ModelDriven模式,可以让开发者使用单独的Model对象来封装用户请求参数,但该Model对象无需继承任何Struts 2基类,是一个POJO
6) 表达式语言方面的对比:
a) Struts1整合了JSTL
b) Struts 2可以使用JSTL,但它整合了一种更强大和灵活的表达式语言:OGNL
7) 绑定值到视图的对比:
a) Struts 1使用标准JSP机制把对象绑定到视图页面;
b) Struts 2使用“ValueStack”技术,使标签库能够访问值,而不需要把对象和视图页面绑定在一起。
• struts2 mvc与spring mvc区别?
1) 配置方面:
a) spring mvc配置可以通过注解方式实现0配置
b) struts2需要采用的传统的配置文件的方式进行配置
2) 性能方面方面:
a) struts2是基于类,struts2框架是类级别的拦截,每次来了请求就创建一个Action,然后调用setter getter方法把request中的数据注入;struts2中,一个Action对象对应一个request上下文。性能较差;
b) spring mvc基于方法,spring3 mvc是方法级别的拦截,拦截到方法后根据参数上的注解,把request数据注入进去,在spring3 mvc中,一个方法对应一个request上下文。
3) 标签库:
a) struts2支持OGNL与JSTL表达式
b) spring mvc只支持EL、JSTL表达式,不支持OGNL表达式
4) 机制:
a) spring mvc的入口是servlet
b) struts2是filter
• Spring IOC和AOP?
IOC
1) 什么是IOC?
IoC就是Inversion of Control,控制反转模式(也称作依赖性介入)的基本概念是:不创建对象,但是描述创建它们的方式。在代码中不直接与对象和服务连接,但在配置文件中描述哪一个组件需要哪一项服务。容器(在 Spring 框架中是 IOC 容器) 负责将这些联系在一起。比如:原来对类的实例是通过类本身new出一个对象,而IOC则是通过容器来实例化对象。
2) 为什么要用IOC?
因为把对象生成放在了XML里定义,所以当我们需要换一个实现子类将会变成很简单,只要修改XML就可以了,这样我们甚至可以实现对象的快速切换。
3) 有什么缺点?
a) 生成一个对象的步骤变复杂了
b) 对象生成因为是使用反射编程,在效率上有些损耗。
c) 缺少IDE重构操作的支持,如果在Eclipse要对类改名,那么你还需要去XML文件里手工去改了,这似乎是所有XML方式的缺憾所在。
AOP
1) 什么是AOP?
AOP就是Aspect Oriented Programming,面向方面编程。是一种编程技术,它允许程序员对横切关注点或横切典型的职责分界线的行为(例如日志和事务管理)进行模块化。AOP 的核心构造是方面,它将那些影响多个类的行为封装到可重用的模块中。
2) 为什么要用AOP?
利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
• XML的解析方式与性能比较?
1.DOM生成和解析XML文档
为 XML 文档的已解析版本定义了一组接口。解析器读入整个文档,然后构建一个驻留内存的树结构,然后代码就可以使用 DOM 接口来操作这个树结构。优点:整个文档树在内存中,便于操作;支持删除、修改、重新排列等多种功能;缺点:将整个文档调入内存(包括无用的节点),浪费时间和空间;使用场合:一旦解析了文档还需多次访问这些数据;硬件资源充足(内存、CPU)。
2.SAX生成和解析XML文档
为解决DOM的问题,出现了SAX。SAX ,事件驱动。当解析器发现元素开始、元素结束、文本、文档的开始或结束等时,发送事件,程序员编写响应这些事件的代码,保存数据。优点:不用事先调入整个文档,占用资源少;SAX解析器代码比DOM解析器代码小,适于Applet,下载。缺点:不是持久的;事件过后,若没保存数据,那么数据就丢了;无状态性;从事件中只能得到文本,但不知该文本属于哪个元素;使用场合:Applet;只需XML文档的少量内容,很少回头访问;机器内存少;
3.DOM4J生成和解析XML文档
DOM4J 是一个非常非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件。如今你可以看到越来越多的 Java 软件都在使用 DOM4J 来读写 XML,特别值得一提的是连 Sun 的 JAXM 也在用 DOM4J。
4.JDOM生成和解析XML
为减少DOM、SAX的编码量,出现了JDOM;优点:20-80原则,极大减少了代码量。使用场合:要实现的功能简单,如解析、创建等,但在底层,JDOM还是使用SAX(最常用)、DOM、Xanan文档。
• Hibernate的优点
1. 对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。
2. Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作
3. hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。
4. hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。
• 面向对象编程思想的特性是什么?
1.抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。(a、数据抽象:就是针对对象的属性,比如建立一个鸟这样的类,鸟会有以下特征,两个翅膀,两支脚,有羽毛等等特性,写成类都是鸟的属性;
b、过程抽象:就是针对对象的行为特征,比如鸟会飞,会跳等等,这些方面的就会抽象为方法,即过程,写成类都是鸟的方法)
2.继承:继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。
3.封装:封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。
4. 多态性:多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多态性(针对方法重载)和包含多态性(针对方法重写)。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。
(重载与重写:方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。Overloaded的方法是可以改变返回值的类型。)
• Extjs原理与优势?
什么是Extjs?
ExtJS是一个用javascript写的,主要用于创建前端用户界面,是一个与后台技术无关的前端ajax框架。因此,可以把ExtJS用在.Net、Java、Php等各种开发语言开发的应用中。
•优点
1、一致的类库
2、实现界面层的MVC编程
3、相对丰富的文档和示例
4、华丽而成熟的界面
•缺点
1、没有合适的开发利器
2、没有界面设计工具
3、文档不全 虽然ExtJS提供的文档很丰富,但是还是跟不上源代码的更新速度,所以,经常要通过看源代码,调试才能真正解决问题。
4、不能编译 这一点可以说是JavaScript的缺点
• Maven的作用?
与Ant区别
1):ant脚本是可以直接运行在maven中的。maven和ant最大的差别就是在于maven的编译以及所有的脚本都有一个基础,就是POM(project object model)。这个模型定义了项目的方方面面,然后各式各样的脚本在这个模型上工作,而ant完全是自己定义,显然maven更胜一筹。
2):Maven对所依赖的包有明确的定义,如使用那个包,版本是多少,一目了然。而ant则通常是简单的inclde 所有的jar。导致的最终结果就是,你根本无法确定JBoss中的lib下的common-logging 是哪个版本的,唯一的方法就是打开 META-INF 目录下MANIFEST.MF。估计JBoss迟早会转向Maven的。
3):Maven是基于中央仓库的编译,即把编译所需要的资源放在一个中央仓库里,如jar,tld,pom,等。当编译的时候,maven会自动在仓库中找到相应的包,如果本地仓库没有,则从设定好的远程仓库中下载到本地。这一切都是自动的,而ant需要自己定义了。这个好处导致的结果就是,用maven编译的项目在发布的时候只需要发布源码,小得很,而反之,ant的发布则要把所有的包一起发布,显然maven又胜了一筹。
4):maven有大量的重用脚本可以利用,如生成网站,生成javadoc,sourcecode reference,等。而ant都需要自己去写。试试 maven site 的效果。
5):maven目前不足的地方就是没有象ant那样成熟的GUI界面,不过mavengui正在努力中。目前使用maven最好的方法还是命令行,又快又方便。
Maven优点:
1、统一管理jar包的版本
2、能进行模块化的打包、编译、部署
3、用大量的重用脚本可以用
Maven缺点:
1、没有成熟的GUI界面
2、由于对jar包进行了版本化的管理,当jar包进行升级或者jar包下载不完整,会出现各种各样jar包依赖错误
• 存储过程的作用与特点?
存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。
优点:
1、与直接执行sql相比存储过程执行效率高。
存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL 语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。
2、升级、维护方便
修改代码需要重新打包部署系统代码,而修改存储过程不需要,只需要在数据库客户端进行修改编译即可。
3、能够缓解网络带宽
java程序对于复杂的sql进行处理,需要多次来回访问远程数据库,增加了网络负担;而封装成存储过程来处理多条sql语句,只需要访问一次数据库。
4、存储过程给底层数据格式增添了额外的抽象层。使得使用存储过程的客户端对存储过程的实现细节以及对底层数据格式是隔离独立的;
5、存储过程单独保护存在于数据库中。客户端可以获取权限执行存储过程,而不需要对底层的具体表设置其他的访问权限;
缺点:
1、可移植性差
公司原来采用sql server开发,后面客户说想要换成Oracle。存储过程改动起来可不是一般的工作量。
2、打破了面向对象编程思想
什么时候该用存储过程?
1、复杂的数据处理用存储过程
如有些生成报表的过程、报表查询。
2、多条件多表联合查询,并做分页处理,用存储过程也比较适合。
3、当在一个事务的完成需要很复杂的商业逻辑时
• Linux系统
•开放性:指系统遵循世界标准规范,特别是遵循开放系统互连(OSI)国际标准。
•多用户:是指系统资源可以被不同用户使用,每个用户对自己的资源(例如:文件、设备)有特定的权限,互不影响
•多任务:它是指计算机同时执行多个程序,而且各个程序的运行互相独立。
•设备独立性:是指操作系统把所有外部设备统一当作成文件来看待,只要安装它们的驱动程序,任何用户都可以象使用文件一样,操纵、使用这些设备,而不必知道它们的具体存在形式。Linux是具有设备独立性的操作系统,它的内核具有高度适应能力。
PS、TOP查看进程
• BIRT特点与工作原理?
1、开发方便快捷,Birt是Eclipse的一个插件可以很好的集成在Eclipse中,图形编辑框架下可以在几分钟之内做出一个报表。
2、可以很方便地在一个报表中混合展现概要数据和详细数据。
3、操作界面友好大方。
4、提供了强大灵活的样式定义,对于熟悉CSS的设计人员来说,应该可以设计出相当出色的报表样式。
5、集成在Eclipse中,不用再开启别报表开发工具窗口,对于习惯于Eclipse开发的程序员来说这点非常重要。
6、Birt的本地化做的很好,安装以后操作界面就是中文的(这点我在使用过程中没有充分体现,我使用了Birt的中文语言包)。
7、开源的报表产品,有源代码,可以进行深层的定制开发。
8、生成的报表完全是XML格式,扩展性好。
9、容易和应用系统结合。
10、最重要一点是开源免费的。
• 多线程的作用和特点?进程与线程的区别?(工厂供电例子)
进程是操作系统结构的基础;是一个正在执行的程序
线程指在程序执行过程中,能够执行程序代码的一个执行单位,每个程序至少都有一个线程,也就是程序本身。
线程的5种状态:新建,就绪,运行,阻塞,死亡。
Thread.sleep:线程 运行状态 转为 阻塞状态。
Thread.yield: 线程 运行状态 转为 就绪状态。
ThreadA.join:等待ThreadA执行完成。
线程的两种方式:
继承自Thread,实现Runnable.
优点:
1、资源利用率更好
2、程序响应更快
是否需要创建多个线程取决于各种因素。在以下情况下,最适合采用多线程处理:
(1)耗时或大量占用处理器的任务阻塞用户界面操作;
(2)各个任务必须等待外部资源 (如远程文件或 Internet连接)。
缺点:
同样的 ,多线程也存在许多缺点 ,在考虑多线程时需要进行充分的考虑。多线程的主要缺点包括:
(1)等候使用共享资源时造成程序的运行速度变慢。这些共享资源主要是独占性的资源 ,如打印机等。
(2)对线程进行管理要求额外的 CPU开销。线程的使用会给系统带来上下文切换的额外负担。当这种负担超过一定程度时,多线程的特点主要表现在其缺点上,比如用独立的线程来更新数组内每个元素。
(3)线程的死锁。即较长时间的等待或资源竞争以及死锁等多线程症状。
(4)对公有变量的同时读或写可能会达不到预期效果。当多个线程需要对公有变量进行写操作时,后一个线程往往会修改掉前一个线程存放的数据,从而使前一个线程的参数被修改;另外 ,当公用变量的读写操作是非原子性时,在不同的机器上,中断时间的不确定性,会导致数据在一个线程内的操作产生错误,从而产生莫名其妙的错误,而这种错误是程序员无法预知的。
• Socket编程原理?TCP/IP 协议?
http://www.cnblogs.com/linzheng/archive/2011/01/23/1942328.html
1、什么是Socket
网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个Socket。Socket通常用来实现客户方和服务方的连接。Socket是TCP/IP协议的一个十分流行的编程界面,一个Socket由一个IP地址和一个端口号唯一确定。
但是,Socket所支持的协议种类也不光TCP/IP一种,因此两者之间是没有必然联系的。在Java环境下,Socket编程主要是指基于TCP/IP协议的网络编程。
1、Socket通讯的过程
Server端Listen(监听)某个端口是否有连接请求,Client端向Server 端发出Connect(连接)请求,Server端向Client端发回Accept(接受)消息。一个连接就建立起来了。Server端和Client 端都可以通过Send,Write等方法与对方通信。
对于一个功能齐全的Socket,都要包含以下基本结构,其工作过程包含以下四个基本的步骤:
(1) 创建Socket;
(2) 打开连接到Socket的输入/出流;
(3) 按照一定的协议对Socket进行读/写操作;
(4) 关闭Socket.(在实际应用中,并未使用到显示的close,虽然很多文章都推荐如此,不过在我的程序中,可能因为程序本身比较简单,要求不高,所以并未造成什么影响。)
• Android
Android:是一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由Google公司和开放手机联盟领导及开发。
Android SDK:SDK:(software development kit)软件开发工具包。被软件开发工程师用于为特定的软件包、软件框架、硬件平台、操作系统等建立应用软件的开发工具的集合。
因此,Android SDK 指的是Android专属的软件开发工具包。
Android运行原理:当我们点击一个应用的时候,系统会自动创建一个相应的activity类实例,然后执行Oncreate方法,接着会执行以下两行代码,解释如下:
super.onCreate(savedInstanceState);一定要执行。完成一些图形的绘制
setContentView(R.layout.main);指定由哪个文件指定布局(main.xml),可以将这个界面显示出来,然后我们进行相关操作,我们的操作会被包装成为一个意图,然后这个意图对应有相关的activity进行处理。
• Tomcat性能优化?
外部优化:
1.JAVA虚拟机性能优化(选择高版本的JDK,设置JVM的内存大小)
2.操作系统性能优化(加内存+硬盘+系统)
3.Tomcat与其它web服务器整合使用(Tomcat+Apache集成,Tomcat处理JSP文件,Apache处理静态文件如:html,css,js)
4.负载均衡
自身优化:
1.停用DNS查询
2,调整线程的数目
3. 预先编译jsp,加快jsp的执行速度
• Servlet生命周期?jsp与servlet的区别?
web容器加载servlet,生命周期开始。通过调用servlet的init()方法进行servlet的初始化。通过调用service()方法实现,根据请求的不同调用不同的do***()方法。结束服务,web容器调用servlet的destroy()方法。
区别:
JSP是Servlet技术的扩展,本质上是Servlet的简易方式,更强调应用的外表表达。JSP编译后是"类servlet"。Servlet和JSP最主要的不同点在于,Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML里分离开来。而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件。JSP侧重于视图,Servlet主要用于控制逻辑。
• 数据库三大范式:
1.第一范式(确保每列保持原子性)
第一范式是最基本的范式。如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库表满足了第一范式。
第一范式的合理遵循需要根据系统的实际需求来定。比如某些数据库系统中需要用到“地址”这个属性,本来直接将“地址”属性设计成一个数据库表的字 段就行。但是如果系统经常会访问“地址”属性中的“城市”部分,那么就非要将“地址”这个属性重新拆分为省份、城市、详细地址等多个部分进行存储,这样在 对地址中某一部分操作的时候将非常方便。这样设计才算满足了数据库的第一范式。
2.第二范式(确保表中的每列都和主键相关)
第二范式在第一范式的基础之上更进一层。第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而 言)。也就是说在一个数据库表中,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中。
3.第三范式(确保每列都和主键列直接相关,而不是间接相关)
第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。
三大范式作用:1、解决数据冗余
2、数据有效性检查
3、提高存储效率。
注意:
规范化也有缺点:由于将一个表拆分成为多个表,在查询时需要多表连接,降低了查询速度。有时候为了查询性能上的考虑,也会违反三大范式的。
• 如何优化数据库?sql语句性能调优的方法有哪些?
1、分割表
2、对于常见的sql或者复杂的sql用存储过程
3、对经常作为查询条件字段建立索引
4、保留冗余列
当两个或多个表在查询中经常需要连接时,可以在其中一个表上增加若干冗余的列,以避免表之间的连接过于频繁。由于对冗余列的更新操作必须对多个表同步进行,所以一般在冗余列的数据不经常变动的情况下使用。
5、增加派生列
派生列是由表中的其它多个列计算所得,增加派生列可以减少统计运算,在数据汇总时可以大大缩短运算时间。
6、sql语句关键字查询优化:
1. NULL 尽量不用IS NULL 与 IS NOT NULL
2. 尽量不用联接列 (first_name||''||last_name)
3. 带通配符(%)的like语句,%不要放在首位查询
4. Order by语句中尽量避免运算
5. 尽量不使用NOT与 <>
6. 用EXISTS代替IN
• 数据库集群与负载均衡
什么是数据库集群?
确切地来说,数据库集群指的是由多个一致并且独立的数据库服务器构成一个逻辑上强大的数据库,它应该同时具备负载均衡、内部实时数据同步、容错和高可用性等功能,还应该对任何原有数据库客户端保持二进制兼容,使得客户端不需要作任何修改就能使用数据库集群。
Oracle RAC集群
SQL Server MSCS集群
双机热备与负载均衡区别在于:
1、双机热备相当于2台服务器其中有一台是另一台的备机,也可以互为备机;主机在运行服务时,备机处于检测状态,主机发生故障后,备机将接管主机的服务
2、负载均衡是在这2台服务器(或N多台)之上增加了一台负载均衡服务器,负载均衡服务器的作用是把用户的请求平均分配到每个节点;增加集群整体的处理能力;实现网络访问的均衡
3、双机热备是为保障24*7小时高可用不停机而推出的产品,而负载均衡是解决服务器压力过大,网络请求大量并发而设计的产品
4、双机热备的优点是:能保障用户服务不间断;负载均衡的优点:WEB访问流畅,用户请求平均分布在每个节点上
5、双机热备缺点:用传统加加阵列的方式增加了存储空间,同样也形成了单点故障;有可能双机热备成为虚设,因为一旦阵列崩溃,服务也意味这停止。
(在条件允许的情况下,可以考虑不加阵列,用软件方式做数据同步,阵列做为备份数据的存储,不失为一个好办法)
6、负载均衡的缺点:适用静态WEB,如果是数据库将不起作用,数据库的多向同步目前还没有完全解决的方案(比如某用户被分配到1号服务器,他在数据库里添加了一条信息;当他下次访问,却被分到2号服务器,那么他原先的数据库信息将不存在)
对于动态的、时常更新的WEB,多向的数据同步也很难,不过我现在已经有了不错的解决办法
因为增加了负载均衡服务器,使得各个节点冗余;但负载均衡器又会形成新的单点故障,所以如果要增加负载均衡设备,一定要选2台做均衡器冗余
负载均衡的优点
• 高可用性:使用群集服务,资源的所有权,如磁盘驱动器和IP地址将自动地从有故障的服务器上,转到可用的服务器上。当群集中的系统或应用程序出现故障时,群集软件将在可用的服务器上,重启失效的应用程序,或将失效节点上的工作,分配到剩余的节点上。结果是,用户只是觉得服务暂时停顿了一下。
• 修复返回:当失效的服务器连回来时,群集服务将自动在群集中平衡负荷。
• 易管理性:可以使用群集管理器来管理群集,(如同在同一个群集中),并管理应用程序(就象它们运行在同一个服务器上)。可以通过拖放群集对象,在群集里的不同服务器移动应用程序。也可以通过同样的方式移动数据。可以通过这种方式来手工地平衡服务器负荷,卸载服务器,从而方便地进行维护。可以从网络的任意地方的节点和资源处,监视群集的状态。
• 可扩展性:群集服务可进行调整,以满足不断增长的需求。当群集的整体负荷超过群集的实际能力时,可以添加额外的节点。
• 什么是sql注入?
所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令。在某些表单中,用户输入的内容直接用来构造(或者影响)动态SQL命令,或作为存储过程的输入参数,这类表单特别容易受到SQL注入式攻击。
如何预防:
1、屏蔽特殊字符或者进行转义
2、使用?号传参,不用字符串拼接方式(使用PreparedStatement,不使用statement)
• 熟悉常用设计模式?
设计模式主要分三个类型:创建型、结构型和行为型。
其中创建型有:
一、Singleton,单例模式:保证一个类只有一个实例,并提供一个访问它的全局访问点
二、Abstract Factory,抽象工厂:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们的具体类。
三、Factory Method,工厂方法:定义一个用于创建对象的接口,让子类决定实例化哪一个类,Factory Method使一个类的实例化延迟到了子类。
四、Builder,建造模式:将一个复杂对象的构建与他的表示相分离,使得同样的构建过程可以创建不同的表示。
五、Prototype,原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型来创建新的对象。
行为型有:
六、Iterator,迭代器模式:提供一个方法顺序访问一个聚合对象的各个元素,而又不需要暴露该对象的内部表示。
七、Observer,观察者模式:定义对象间一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知自动更新。
八、Template Method,模板方法:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,TemplateMethod使得子类可以不改变一个算法的结构即可以重定义该算法得某些特定步骤。
九、Command,命令模式:将一个请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化,对请求排队和记录请求日志,以及支持可撤销的操作。
十、State,状态模式:允许对象在其内部状态改变时改变他的行为。对象看起来似乎改变了他的类。
十一、Strategy,策略模式:定义一系列的算法,把他们一个个封装起来,并使他们可以互相替换,本模式使得算法可以独立于使用它们的客户。
十二、China of Responsibility,职责链模式:使多个对象都有机会处理请求,从而避免请求的送发者和接收者之间的耦合关系
十三、Mediator,中介者模式:用一个中介对象封装一些列的对象交互。
十四、Visitor,访问者模式:表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变各元素类的前提下定义作用于这个元素的新操作。
十五、Interpreter,解释器模式:给定一个语言,定义他的文法的一个表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
十六、Memento,备忘录模式:在不破坏对象的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。
结构型有:
十七、Composite,组合模式:将对象组合成树形结构以表示部分整体的关系,Composite使得用户对单个对象和组合对象的使用具有一致性。
十八、Facade,外观模式:为子系统中的一组接口提供一致的界面,facade提供了一高层接口,这个接口使得子系统更容易使用。
十九、Proxy,代理模式:为其他对象提供一种代理以控制对这个对象的访问
二十、Adapter,适配器模式:将一类的接口转换成客户希望的另外一个接口,Adapter模式使得原本由于接口不兼容而不能一起工作那些类可以一起工作。
二十一、Decrator,装饰模式:动态地给一个对象增加一些额外的职责,就增加的功能来说,Decorator模式相比生成子类更加灵活。
二十二、Bridge,桥模式:将抽象部分与它的实现部分相分离,使他们可以独立的变化。
二十三、Flyweight,享元模式
• 你常用的UML图像?
1、用例图:从用户的角度描述系统功能(用户、测试人员)
2、类框图:描述对象模型中类与类直接的关系(开发人员必须理解的)
3、时序图:描述对象的交互关系:消息发送和接收的过程(执行过程流程)
4、部署图:系统物理组件之间的依赖关系(物理设备,技术支持)
• 面向对象的好处?
活字印刷术:未发明前,诗句只要有一个字错了,就需要重新写。
1、可维护性:诗句只要修改错误的字就可以了,其他的活字不需要改
2、可复用性:诗句中的每个活字可以重复使用
3、可扩展性:诗句中想要加一个字,刻好加进去就可以了
4、灵活性:诗句需要进行横排或者竖排,只要移动活字就可以实现
• 类之间有哪些关系?
关联:类A与类B的实例之间存在特定的对应关系
依赖:类A访问类B提供的服务
聚集:类A为整体类,类B为局部类,类A的对象由类B对象组成
泛化:类A继承类B
实现:类A实现B接口