一、JAVA基础知识
1.1、面向对象的特征:抽象、继承、封装、多态
1)抽象:抽象就是忽略一个主题中与当前目标无关的哪些方面,以便充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一个过程抽象,而是数据抽象。
2)继承:继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类哪里继承方法和实例变量,并且类可以修改或增加新的方法使之更合适特殊的需要。
3)封装:封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向、对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。
4)多态性:多态性事指允许不同类的对象对同一个消息作出响应。多态性包括参数多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。
1.2、int Integer的区别:java提供两种不同的类型:引用类型和原始类型(或内置类型)。Int是java的原始类型数据,Integer是java为int提供的封装类。Java为每个原始类提供了封装类。
*原始类型封装:
1)booleanBoolean
2)charCharacter
3)byteByte
4)shortShort
5)intInteger
6)longLong
7)floatFloat
8)doubleDouble
*引用类型和原始类型的行为完全不同,并且它们具有不同的语义。引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为null,而原始类型实例变量的缺省值与它们的类型有关。
1.3、String和StringBuffer类的区别
1)它们都是处理字符串的类,但它们有一个最大的区别,那就是String对象是存储你不能改动的文本字符串,相反,如果你希望改动,则应使用StringBuffer类作为替换。
2)StringBuffer是可变的,而String是不可变的。
3)而且String用得多个的话会占用不同的内存:
如:String str = “bb”;
str = “aa”;
前一个bb的内存地址不变,当又给它赋值为aa时它又指向aa的地址,
而StringBuffer就不会这样.
:”==”比较的是两个对象的地址,”equals()”比较的是两个对象的值。
1.4、用java访问Oracle数据库、取得记录并输出到界面
答:…
Class.forName(“oracle.jdbc.driver.OracleDriver”);
Connection conn = DriverManager.getConnection(url, username, password);
Statement stmt = conn.createStatement();
String str = “select *from [table]”;
ResultSet rs = stmt.executeQuery(str);
While(rs.next()){
…
}
rs.close();
stmt.close();
conn.close();
1.5、概述java垃圾回收机制
答:它的工作原理:当不存在一个对象,我们就假定不在需要哪个对象,哪个对象所占有的存储单元可以被收回,可通过System.gc()方法回收,但一般要把不再引用的对象标志为null为佳。
1.6、java类是否可以多继承,怎么实现多继承?
答:Java没有多继承,但是可以通过接口的形式来达到多继承的目地。
1.7、接口有什么优点?
答:接口有以下优点:
1)接口只是一个框架而没有实现,因此在接口定义时不需要考虑口中的方法如何实现。
2)利用接口可达到实现多继承的目地。
3)可以在不暴露对象的类的情况下,暴露对象的编程接口。
4)不用强迫关系在无关类中截获相似处(采用适配器就可以了)
5)声明想执行的一个或多个方法
1.8、Java是否存在内存泄露?
答:存在,当一个对象引用另一个对象后,当另一对象为空时,会出现内存泄露。
1.9、Java有哪些特点?
答:Java具有以下几个主要特点:
1)简单性
2)面向对象:Java是完全面向对象的,它支持静态和动态风格的代码继承及重用
3)分布式:包括数据分布和操作分布
4)健壮性:Java系统仔细检测对内存的每次访问,确认它是否合法,而且编译和运行程序时,都要对可能出现的问题进行检查,以消除错误的产生。
5)结构中立
6)安全性:Java不支持指针,一切对内存的访问都必须通过对象的实例变量来实现,这样就防止程序员使用木马等欺骗手段访问对象的私有成员,同时也避免了指针操作中容易产生的错误。
7)与平台无关:Java写应用程序不用修改就可在不同的软硬平台上运行。平台无关性有两种:
a)源代码和目标代码级。
b)Java主要靠java虚拟机在目标代码级上实现平台无关性。
8)解释执行:运行Java程序时,它首先被编译成字节代码,字节代码非常类似机器码,执性效率非常高
9)高性能
10)多性程
11)多态性:她允许程序动态的装入运行时需要的类。
1.1.0、UML方面
答:标准建模语言UML。用例图,静态图(包括:类图、对象图和包图),行为图,交互图(顺序图,合作图),实现图。
1.1.1、什么叫抽象类?抽象类跟接口有什么区别?为什么引进数据接口概念?
答:具有关键字abstract,实现内容上没有完全定义的类就叫抽象类。
抽象类和接口的区别如下:
1)在类来继承抽象类时,只需要实现部分方法和全部抽象方法,而实现接口则要实现里面的全部方法。
2)在接口中无成员变量,而抽象类可有成员变量。
3)在java中引进接口主要是为了解决多继承的问题。
1.1.2、doGet和doPut的区别?
答:doPut会把地址作为一个文件写到服务器,而doGet不会,而只是显示在地址栏。
1.1.3、类变量的初始化
答:在Java中类变量在局部中一定要初始化,因为局部变量会覆盖全局变量,否则会报错:变量未初始化。全局变量则可以不初始化,而到具体的内部方法或其他的类成员中初始化。
1.1.4、数组的定义
答:数组是作为一种对象实现的。数组元素可以包含作何类型值,但数组里面的每个元素的类型必须一致创建数组步聚如下:
1)声明
2)构造
3)初始化
二、集合
2.1、Collection层次结构中的跟接口
1)Collection表示一组对象,这些对象也称为collection的元素。
2)Java集合的缺点:类型未知
3)总的来说,java API中所用的集合类,都是实现了Collection接口,他的一个类继承结构如下:
*Collection
*Collection
*Collection
*Collection
4)List是基于Array,可以有重复的值。
5)Vector:基于Array的List很重要的一点就是Vertor“sychronized”的,这个也是Vector和ArrayList的唯一区别
6)ArrayList:基于Array上链表,但是不同的是ArrayList不是同步的
7)LinkedList:它不是基于Array的,所以不能接受Array性能的限制。它每一个节点(Node)都包含两方面的内容
a) 节点本身的数据(data)
b) 下一个节点的信息(nextNode)。所以当对LinkedList做添加,删除动作的时候就怒能像基于Array的List一样,必须进行大量的数据移动。只要更改nextNode的相关信息就可以实现了。这就是LinkedList的优势。
8)HashSet:虽然同List都实现了Collection接口,但是他们的实现方式却不大一样。List基本上都是以Array为基础。但是Set则是在HashMap的基础来实现的,这个就是Set和List的根本区别。HashSet的存储方式是把HashMap中的Key作为Set的对应存储。
9)Set总结:
1)Set实现的基础是Map(HashMap)。
2)Set中的元素不能重复的,如果使用add(Object obj)方法添加已经存在的对象,则会覆盖前面的对象。
10)性能时Map所要面对的一个大问题。如果你知道get ( )时怎么工作的,你就会发觉(比方说)在ArrayList里面找对象会是相当慢的。而这正是HashMap的强项。它不是慢慢地一个个地找这个键,而是用用了一种被称为“hash code”的特殊值进行查找的。散列(hash)时一种算法,它会从目标对象当中提取一些信息,然后生成一个表示这个对象的“相对独特”的int。HashCode ( )是Object根类的方法,因此所有的Java对象都能生成Hash Code。HashMap则利用对象的hashCode ( )来进行快速查找。这样性能就有了急剧的提高。
2.2、Hastable 与HashMap的区别?
答:Hashtable和Hashmap的主要区别如下:
1) Hashtable是同步的,而HashMap不是同步的。所以不要求同步的时候,用HashMap的效率较高
2)Hashtable版本较HashMap版本低。
2.3、说明List和Set的区别
答:两者主要区别如下:
1) List用来处理序列,而Set用来处理集。
2) List中的内容可以重复,而Set则不行。
三、设计模式方面
3.1、开发中都用到了那些设计模式?在什么场合?
答:每个模式都描述了一个在我们的环境中不断出现的问题,然后描述了该问题的解决方案的核心。通过这种方式,你可以无数次地使用那些已有解决的方案。无需要重复相同的工作。主要用到了MVC的设计模式。用来开发JSP/Servlet或者J2EE的相关应用。简单工厂模式等。
3.2、概述MVC体系结构
答:在MVC包括三类对象:
a)model:模型,操作数据的业务处理层,并立于表现层(Independe ntof
presentation)
b)view:视图,通过客户端数据类型显示数据,并回显模型层的执行结果。
c)controller是控制器,它定义用户界面对用户输入的响应方式。
1)在MVC体系中,模型通常被称为“业务逻辑”,是真正完成任务的代码,视图就是使用界面,反映数据的变化。控制器控制模型和视图之间的交互过程。它决定着用户返回怎眼的视图、检查通过界面输入信息以及选择出来输入信息的模型
2)在MVC中,表示层和逻辑层分离,各部分可相互独立进行开发,便于开发和维护,提高了开发效率
3.3、创建模式
1)设计模式之Factory(工厂模式)
2)设计模式之Prototype(原型模式):用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
3)设计模式之Builder:汽车由车轮 方向盘 发动机很多部件组成,同时,将这些部件组装成汽车也是一件复杂的工作,Builder模式就是将这两种情况分开进行。
4)设计模式之Singleton(单态模式):保证一个类只有一个实例,并提供一个访问它的全局访问点。
3.4、结构模式
1)设计模式之Facade:可扩展的使用JDBC针对不同的数据库编程,Facade提供了一种灵活的实现.
2)设计模式之Proxy:以Jive为例,剖析代理模式在用户级别授权机制上的应用
3)设计模式之Adapter:使用类再生的两个方式:组合(new)和继承(extends),这个已经在"thinking in java"中提到过.
4)设计模式之Composite:就是将类用树形结构组合成一个单位.你向别人介绍你是某单位,你是单位中的一个元素,别人和你做买卖,相当于和单位做买卖。文章中还对Jive再进行了剖析。
5)设计模式之Decorator:Decorator是个油漆工,给你的东东的外表刷上美丽的颜色.
6)设计模式之Bridge:将"牛郎织女"分开(本应在一起,分开他们,形成两个接口),在他们之间搭建一个桥(动态的结合)
7)设计模式之Flyweight:提供Java运行性能,降低小而大量重复的类的开销.
3.5、行为模式
1)设计模式之Template:实际上向你介绍了为什么要使用Java 抽象类,该模式原理简单,使用很普遍.
2)设计模式之Memento:很简单一个模式,就是在内存中保留原来数据的拷贝.
3)设计模式之Observer:介绍如何使用Java API提供的现成Observer
4)设计模式之Chain of Responsibility:各司其职的类串成一串,好象击鼓传花,当然如果自己能完成,就不要推委给下一个.
5)设计模式之Command:什么是将行为封装,Command是最好的说明.
6)设计模式之State:状态是编程中经常碰到的实例,将状态对象化,设立状态变换器,便可在状态中轻松切换.
7)设计模式之Strategy:不同算法各自封装,用户端可随意挑选需要的算法.
8)设计模式之Mediator:Mediator很象十字路口的红绿灯,每个车辆只需和红绿灯交互就可以.
9)设计模式之Interpreter:主要用来对语言的分析,应用机会不多.
10)设计模式之Visitor:访问者在进行访问时,完成一系列实质性操作,而且还可以扩展.
11)设计模式之Iterator:这个模式已经被整合入Java的Collection.在大多数场合下无需自己制造一个Iterator,只要将对象装入Collection中,直接使用Iterator进行对象遍历。
3.6、单例模式特点(什么是单例模式)?
1)单例类只能有一个实例
2)单例类必须自己创建自己的唯一实例
3)单例类必须给所有其他对象提供这一实例。
3.7、单例模式的作用(用单例模式的目的)?
答:Singleton模式主要作用是保证在JAVA应用程序中,一个Class只有一个实例存在。
3.8、单例有几种?
1)第一种形式:懒汗式单例类
- 优点:第一次调用才初始化,避免浪费内存
- 缺点:必须加锁才能保证单例,但加锁也会影响效率
2)第二种形式:饿汉式单例类 - 优点:没有加锁。执行效率会提高
- 缺点:类加载是就初始化,浪费内存
3)第三种形式:登记式单例类 - 内部类只有在外部类调用才能被加载,又不用加锁,此模式有前两个模式的优点,屏蔽了它们的缺点,是最好的单例模式类
3.9、工厂模式
1)第一种形式:简单工厂
- 把对象的创建放到一个工厂类中通过参数来创建不同的对象。
2)第二种形式:工厂方法 - 每种产品由一种工厂来创建
3)第三种形式:抽象工厂 - 感觉只是工厂方法的复杂化,产品系列复杂化的工厂方法。
四、多线程
4.1、多线程的优点:
答:可分两方面:
1)相对于但现场而言:可以响应多任务的并发操作。
多线程取消了主循环和轮流检测机制,一个线程可以暂停而不阻止系统其他的部分的执行,而且程序中一个线程阻塞时,只有那个被阻塞的线程暂停,所有其他的线程继续执行。
2)相对进程而言(可答可不答):它所要要求的开销比较小,转换成本较小。所有线程共享同一地址空间,相互协作,彼此之间通信很容易。
4.2、多线程实现有哪几种方法,同步有哪几种方法?
答:实现同步主要有两种方法:
1)Synchronized
2)Wait notify
实现多线程主要继承Thread类和实现Runnable接口。(应用程序可以使用Executor框架来创建线程池。)
4.3、在java中wait( )和sleep( )方法的不同?
答:通常会在电话面试中经常被问到的Java线程面试问题。最大的不同是在等待时wait会释放锁,而sleep一直持有锁。Wait通常被用于线程间交互,sleep通常被用于暂停执行。
4.4、线程有几种状态?
1)就绪(Runnable):线程准备运行,不一定立马就能开始执行
2)运行(Running):进程正在执行线程代码
3)等待(Waiting):线程处于阻塞的状态,等待外部的处理结果
4)睡眠(Sleeping):线程被强制睡眠
5)堵塞(Blocked on I/O):等待I/O操作完成
6)同步堵塞(Blocked on Synchroniztion):等待获取锁
7)死亡(Dead):线程完成执行
五、JSP
5.1、JSP页面的跳转?
答:JSP页面实现跳转主要有jsp:forward和sendRedirect两种方法。
1)jsp:forward:在容器内跳转。跳转后,地址栏地址不变。效率高。跳转后立即结束本页的内容。
2)sendRedirect:在容器之间的跳转,跳转后地址栏地址为跳转后的地址,效率较低。
5.2、JSP共有9种基本内置组件(可与ASP的6种内部组件相对应)
1)request 用户端请求,此请求会包含来自 GET/POST 请求的参数
2)response 网页传回用户端的回应
3)page JSP 网页本身
4)exception 针对错误网页,未捕捉的例外
5)pageContext 网页的属性是在这里管理
6)session 与请求有关的会话期
7)application servlet 正在执行的内容
8)out 用来传送回应的输出
9)config Servlet 的构架部件
六、Struts
6.1、概述Struts,以及Struts如何实现MVC构架的?
答:struts framework是一种基于java技术,Web应用程序开发人员通过struts framework即可充分利用面向对象设计、代码重用以及“编写一次、到处运行”的优点。Struts提供了一种创建Web应用程序的框架,其中应用程序的显示、表示和数据的后端代码进行了抽象。Struts采用的jsp作为MVC的视图,由ActionServlet具体指定的action动作类作为控制器即MVC中的C,负责视图与模型之间的交互。控制器的每个入口点都由名为struts-config.xml的配置文件设置。该文件把来自视图的请求映射为特定的JAVA类进行相应的处理,控制器还指定下一个视图的位置。Struts中的模型主要指的就是javabean,它是模型的代表,主要封装数据和业务逻辑。
6.2、Struts的处理流程:
1)控制器进行初始化工作,读取配置文件,为不同的Struts模块初始化相应的ModulConfig对象。
2)控制器接收Http请求,并从ActionConfig中找出对应于请求的Action子类,如果没有对应的Action,控制器直接将请求转发给JSP或者静态页面,否则控制器将请求分至具体的Action类进行处理。
3)在控制器调用具体的Action的Execute方法之前,ActionForm对象将利用Http请求中的参数来填充自己。还可以在ActionForm类中调用Validate方法来检查请求参数的合法性,并且可以返回一个包含所有错误信息的ActionErrors对象。
4)执行具体的Execute的方法,它负责执行相应的业务逻辑。执行完后,返回一个ActionForward对象,控制器通过该ActionForward对象进行转发工作。也可以把Action要处理的业务逻辑封装在javaBean中,如果系统中海油EJB,那么通过JavaBean调用EJB以完成业务逻辑,如果没有EJB,那么就直接在JavaBean中连接数据库,进行数据库相关操作。
6.3、Struts优点?
1)Struts是开源软件,使开发者能更深入的了解其内部实现机制。
2)Struts优点:业界标准,学习资源丰富。
3)Struts的优点主要集中体现在两个方面标签库和导航页面
a)使用Struts提供的标签库可以大大节约开发时间。
b)维护扩展比较方便,通过配置文件,即可把握整个系统各部分之间的联系,这对于后期的维护有着莫大的好处。
4)表现与逻辑分离
5)表单验证解决了请求数据的验证问题,增强了系统健壮性。
6)便于团队发开
6.4、Struts缺点?
1)大量的使用标签,对于初学则难打较大
2)ActionForms使用不便,无法进行单元测试(StrutsTestCase只能用于集成)
6.5、Struts提供了几个标签库?
答:Struts提供五个标签库。即:HTML、Bean、Logic、Template和Nested
1)HTML标签: 用来创建能够和Struts 框架和其他相应的HTML 标签交互的HTML 输入表单
2)Bean标签:在访问JavaBeans 及其属性,以及定义一个新的bean 时使用
3)Logic标签:管理条件产生的输出和对象集产生的循环
4)Template标签:随着Tiles框架包的出现,此标记已开始减少使用
5)Nested标签:增强对其他的Struts 标签的嵌套使用的能力
七、Spring
7.1、什么是Spring?
答:Spring 是个java企业级应用的开源开发框架。Spring主要用来开发Java应用,但是有些扩展是针对构建J2EE平台的web应用。Spring 框架目标是简化Java企业级应用开发,并通过POJO为基础的编程模型促进良好的编程习惯。
7.2、使用Spring框架的好处是什么?
1)轻量:Spring是轻量的,基本的版本大约2MB
2)控制反转:Spring通过控制反转实现了松散耦合,对象给它们的依赖,而不是创建或查找依赖对象们。
3)面向切面的编程(AOP):Spring支持面向切面的编程,并且把应用业务逻辑和系统服务分开。
4)容器:Spring包含并管理应用中对象的生命周期和配置。
5)MVC框架:Spring的WEB框架是精心设计的框架,是web框架的一个很好替代品。
6)事务管理:Spring提供了一个持续的事务管理接口,可以扩展到上至本地事务下至全局事务。
7)异常处理:Spring提供了方便的API把具体技术相关的异常转化一致的unchecked异常。
7.3、Spring工作机制及为什么要用?
1)Spring是一个开源框架,是为了解决企业应用程序开发复杂性而创建的。Spring即是一个AOP框架,也时一个IOC容器。
2)Spring的核心就是IOC和AOP,所以Spring的工作机制简单的理解也就是IOC和AOP的工作机制。
3)借助于Spring AOP,Spting IoC能够方便的使用到非常健壮、灵活的企业级服务,通过使用IoC能够降低组件之间的耦合度,最终,能够提高类的重要性,利于测试,而且更利于整个产品或系统集成和配置。
7.4、说说AOP和IoC感念以及在Spring中是如何应用的?
1)AOP,面向切面的编程
- AOP方式很类似filter,就是在程序正常的业务流总监像切面一样插入很多其他需要执行的代码。面向方面的编程,即AOP,是一种编程技术,它允许程序员对横切关注点或横切典型地职责分界线行为。进行模块化,AOP的构造核心是方面,它将影响多各类的行为封装到可重用的模块中。
2)IOC,控制反转 - 简单说一下,IOC其实就是依赖注入,即用接口编程,在程序中不用出现new关键字,而是用接口来命名引用,然后通过某种方式把接口的某个实现类的实例注入到引用里,从而实现接口与具体实现类的松耦合。
7.5、声明式事务
1)使用Spring声明式事务,spring使用aop来支持声明式事务,会根据事务属性,自动在方法调用决定是否开启一个事务,并在方法执行之后决定事务提交或回滚事务。
2)大多数Spring框架的用户选择声明式事务管理。因为它对应代码的影响最小,因此符合一个无侵入的轻量级容器的思想,声明式事务管理要优于编程式事务管理,虽然比编程式事务管理(这种方式允许你通过代码控制事务)少一点灵活性。
7.6、解释AOP模块
答:AOP模块用于发给我们的Spring应用做面向切面的开发,很多支持有AOP联盟提供,这样就确保了Spring和其他AOP框架的共同性。这个模块将元数据编程引入Spring。
7.7、什么是Spring IoC容器?
答:IOC负责创建对象,管理对象(通过依赖注入(DI)),装配对象,配置对象,并且管理这些对象的整个生命周期
7.8、IOC的优点是什么?
答:IOC或依赖注入把应用的代码量降到最低,它使用应用测试,单元测试不在需要单例和JBDI查找机制,最小的代码和最小的侵入性使松散耦合得意实现。IOC容器支持加载服务时的饿汗式初始化和懒加载。
7.9:一个Spring的应用看起来像什么?
一个定义了一些功能的接口
这实现包括属性,它的Setter,getter方法和函数等
Spring AOP
Spring的XML配置文件
7.1.0、什么是Spring的依赖注入?
依赖注入,是IOC的一个方面,是通常的概念,它有多种解释,这概念是说你不用创建对象,而只需要描述它如何被创建,你不在代码里直接组装你的组件和服务,但是要在配置文件里描述那些组件需要那些服务,之后一个容器(IOC容器)负责把他们组装起来。
7.1.1、Spring框架的事务管理有哪些优点?
它为不同的事务API,提供一个不变的编程模式
它为编程式事务管理提供了一套简单的API而不是一些复杂的事务API
它支持声明式管理。
它和Spring各种数据访问抽象很好的集成。
7.1.2、Spring面向切面编程(AOP)
答:面向切面编程:或AOP,是一种编程技术,允许程序模块化横向切割关注点,或横切典型责任划分。如日志和事务管理
7.1.3、什么是Spring的MVC框架?
Spring配备构建Web应用的全功能MVC框架,Spring可以很便捷的和其他MVC框架集成,Spring的MVC框架用控制反转把业务对象和控制逻辑清晰的隔离,它也允许声明的方式把请求参数和业务对象绑定。
八、Hibernate
8.1、Hibernate有几种查询方式?
1)Sql
2)Hql
3)条件查询
8.2、Hibernate实现类之间的关系,一对多,多对多,配置文件生成。
8.3、CGLIB(code generation libary)是数据持久层编程框架Hibernate中用到的一种放射机制,它不同于Java中的反射机制,是一种更灵活,封装更好的反射机制。
8.4、CGLIB技术不仅可以动态实现接口,还可以实现类,可以对类的方法进行隐蔽,修改。这也是CGLIB中最突出的特点。代理,反射和元数据是java的三大重要特征。在配合ASM和CGLIB的出色的反射技术,设计出一个优秀的应用框架。
8.5、Hibernate缓存的作用?
答:Hibernate是一个持久层框架,经常访问物理数据库,为了降低应用程序对物理数据源访问的频次,从而提高应用程序的运行性能。缓存内的数据是对物理数据源中的数据的复制,应用程序在运行时从缓存读写数据,在特定的时刻或事件会同步缓存和物理数据源的数据。
8.6、Hibernate缓存分类
答:Hibernate缓存包括两大类:
1)Hibernate一级缓存
- Hibernate一级缓存又称为“Session”的缓存,它是内置的,不能被卸载(不能被卸载的意思就是这种缓存不具有可选性,必须有的功能,不可以取消session缓存)。由于Session对象的生命周期通常对应一个数据库事务或者一个应用事务,因此它的缓存是事务范围的缓存。第一级缓存是必需的,不允许而且事实上也无法卸除。在第一级缓存中,持久化类的每个实例都具有唯一的OID。
2)Hibernate二级缓存 - Hibernate二级缓存又称为“SessionFactory的缓存”,由于SessionFactory对象的生命周期和应用程序的整个过程对应,因此Hibernate二级缓存是进程范围或者集群范围的缓存,有可能出现并发问题,因此需要采用适当的并发访问策略,该策略为被缓存的数据提供了事务隔离级别。第二级缓存是可选的,是一个可配置的插件,在默认情况下,SessionFactory不会启用这个插件
8.7、什么样的数据适合放到第二季缓存中?
1)很少被修改的数据
2)不是很重要的数据,允许出现偶尔并发的数据
3)不会被并发访问的数据
4)常量数据
8.8、不适合存放到第二级缓存的数据?
1)经常被修改的数据
2)绝对不允许出现并发访问的数据,如财务数据,绝对不允许出现并发
3)与其他用共享的数据。
8.9、Hibernate查找对象如何应用缓存?
答:当Hibernate根据ID访问数据对象的时候,首先从Session一级缓存中查;查不到,如果配置了二级缓存,那么从二级缓存中查;如果都查不到,再查询数据库,把结果按照ID放入到缓存 删除、更新、增加数据的时候,同时更新缓存
8.1.0、Hibernate管理缓存实例
答:无论何时,我们在管理Hibernate缓存(Managing the caches)时,当你给save()、update()或saveOrUpdate()方法传递一个对象时,或使用load()、 get()、list()、iterate() 或scroll()方法获得一个对象时, 该对象都将被加入到Session的内部缓存中。 当随后flush()方法被调用时,对象的状态会和数据库取得同步。 如果你不希望此同步操作发生,或者你正处理大量对象、需要对有效管理内存时,你可以调用evict() 方法,从一级缓存中去掉这些对象及其集合。
九、数据库
9.1、主键,超键,候选键,外键
1)主键:数据库表中对储存数据对象予以唯一和完整标识的数据列或属性的组合。一个数据列只能有一个主键,且主键的取值不能缺失,即不能为空值(Null)
2)超键:在关系中能唯一标识元组的属性集称为关系模式的超键。一个属性可以为作为一个超键,多个属性组合在一起也可以作为一个超键。超键包含候选键和主键
3)候选键:是最小超键,即没有冗余元素的超键
4)外键:在一个表中存在的另一个表的主键称此表的外键
9.2、数据库的四个特性及含义?
答:数据库事务transanction正确执行的四个基本要素。ACID,原子性(Atomicity)、一致性(Correspondence)、隔离性(Isolation)、持久性(Durability)
1)原子性:整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
2)一致性:在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏
3)隔离性:隔离状态执行事务,使它们好像是系统在给定时间内执行的唯一操作。如果有两个事务,运行在相同的时间内,执行 相同的功能,事务的隔离性将确保每一事务在系统中认为只有该事务在使用系统。这种属性有时称为串行化,为了防止事务操作间的混淆,必须串行化或序列化请 求,使得在同一时间仅有一个请求用于同一数据
4)持久性:在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚
9.3、索引的工作原理及其种类?
答:数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。索引的实现通常使用B树及其变种B+树
1)在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构,就是索引
2)为表设置索引要付出代价的:
a)增加了数据库的存储空间
b)在插入和修改数据时要花费较多的时间(因为索引也要随之变动)
9.3、外连接
答:概念:包括左向外联接、右向外联接或完整外部联接
9.4、左连接:left join 或 left outer join
答:左向外联接的结果集包括 LEFT OUTER 子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值(null)
1)sql语句
select * from table1 left join table2 on table1.id=table2.id
注释:包含table1的所有子句,根据指定条件返回table2相应的字段,不符合的以null显示
9.5、右连接:right join 或 right outer join
答:右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值
1)sql语句
select * from table1 right join table2 on table1.id=table2.id
注释:包含table2的所有子句,根据指定条件返回table1相应的字段,不符合的以null显示
9.6、内连接join 或 inner join
答:概念:内联接是用比较运算符比较要联接列的值的联接
1)sql语句
select * from table1 join table2 on table1.id=table2.id
注释:只返回符合条件的table1和table2的列
9.7、完整外部联接:full join 或 full outer join
答:)完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值
1)sql语句
select * from table1 full join table2 on table1.id=table2.id
注释:返回左右连接的和(见上左、右连接)
9.8、数据库优化的思路
1)SQL语句优化
a)应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描
b)应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:select id from t where num is null
可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:select id from t where num=0
c)很多时候用 exists 代替 in 是一个好的选择
d)用Where子句替换HAVING 子句 因为HAVING 只会在检索出所有记录之后才对结果集进行过滤
9.9、索引优化
答:看上下索引
9.1.0、数据库结构优化
1)范式优化: 比如消除冗余(节省空间。。)
2)反范式优化:比如适当加冗余等(减少join)
3)拆分表: 分区将数据在物理上分隔开,不同分区的数据可以制定保存在处于不同磁盘上的数据文件里。这样,当对这个表进行查询时,只需要在表分区中进行扫描,而不必进行全表扫描,明显缩短了查询时间,另外处于不同磁盘的分区也将对这个表的数据传输分散在不同的磁盘I/O,一个精心设置的分区可以将数据传输对磁盘I/O竞争均匀地分散开。对数据量大的时时表可采取此方法。可按月自动建表分区。
4)拆分其实又分垂直拆分和水平拆分:
案例: 简单购物系统暂设涉及如下表:
1.产品表(数据量10w,稳定)
2.订单表(数据量200w,且有增长趋势)
3.用户表 (数据量100w,且有增长趋势) 以mysql为例讲述下水平拆分和垂直拆分,mysql能容忍的数量级在百万静态数据可以到千万
a)垂直拆分:解决问题:表与表之间的io竞争 不解决问题:单表中数据量增长出现的压力 方案: 把产品表和用户表放到一个server上 订单表单独放到一个server上
b)水平拆分: 解决问题:单表中数据量增长出现的压力 不解决问题:表与表之间的io争夺
方案: 用户表通过性别拆分为男用户表和女用户表 订单表通过已完成和完成中拆分为已完成订单和未完成订单 产品表 未完成订单放一个server上 已完成订单表盒男用户表放一个server上 女用户表放一个server上
9.1.1、存储过程与触发器的区别?
答:触发器与存储过程非常相似,触发器也是SQL语句集,两者唯一的区别是触发器不能用EXECUTE语句调用,而是在用户执行Transact-SQL语句时自动触发(激活)执行。触发器是在一个修改了指定表中的数据时执行的存储过程。通常通过创建触发器来强制实现不同表中的逻辑相关数据的引用完整性和一致性。由于用户不能绕过触发器,所以可以用它来强制实施复杂的业务规则,以确保数据的完整性。触发器不同于存储过程,触发器主要是通过事件执行触发而被执行的,而存储过程可以通过存储过程名称名字而直接调用。当对某一表进行诸如UPDATE、INSERT、DELETE这些操作时,SQLSERVER就会自动执行触发器所定义的SQL语句,从而确保对数据的处理必须符合这些SQL语句所定义的规则。