91. Session简述
HTTP协议 是“一次性单向”协议。 服务端不能主动连接客户端,只能被动等待并答复客户端请求。客户端连接服务端,发出一个HTTP Request,服务端处理请求,并且返回一个HTTP Response给客户端,本次HTTP Request-Response Cycle结束。 我们看到,HTTP协议本身并不能支持服务端保存客户端的状态信息。于是,Web Server中引入了session的概念,用来保存客户端的状态信息。
Session实现原理
I、创建Session的时候,服务器将生成一个唯一的sessionid然后用它生成一个关闭浏览器就会失效的cookie。
II、然后再将一个与这个sessionid关联的数据项加入散列表。
例如这样一段代码:Session["UserName"]=23;
假设sessionid为123那么散列表中会追加一行
sessionid username
123 23
III、当浏览器端提交到服务器时,会通过sessionid=123去散列表中寻找属于该用户的Session信息。
一般用来实现Session的方法有两种:
(1)URL重写。
Web Server在返回Response的时候,检查页面中所有的URL,包括所有的连接,和HTML Form的Action属性,在这些URL后面加上“;jsessionid=XXX”。
下一次,用户访问这个页面中的URL。jsessionid就会传回到Web Server。
(2)Cookie。
如果客户端支持Cookie,Web Server在返回Response的时候,在Response的Header部分,加入一个“set-cookie: jsessionid=XXXX”header属性,把jsessionid放在Cookie里传到客户端。 客户端会把Cookie存放在本地文件里,下一次访问Web Server的时候,再把Cookie的信息放到HTTP Request的“Cookie”header属性里面,这样jsessionid就随着HTTP Request返回给Web Server。
92. 写出你熟悉的开源框架以及各自的作用(重点讲SSH)
答:框架:hibernate,spring,struts1/struts2.
Hibernate主要用于数据持久化;封装了JDBC操作;还提供了一个易用的、高效率的对象关系映射框架;
Spring 的控制反转能起到解耦合的作用;
Struts 主要用于请求处理的流程控制;struts是基于MVC模式的,很好的将应用程序进行了分层,使开发者更关注于业务逻辑的实现;struts有着丰富的taglib,如能灵活运用,则能大大提高开发效率。Struts(表示层)+Spring(业务层)+Hibernate(持久层)
93. Struts对MVC的体现
M: 在Struts中,模型由JavaBean和EJB组件组成,用来实现程序的业务逻辑部分.
C: ActionServlet,RequestProcessor和Struts辅助类来实现控制器。ActionServlet是Struts中的核心控制器ActionServlet会根据在Struts配置文件中的配置将控制权转交给相应的Action类。Action 类是业务的代理,在Action类中可以调用模型组件或者编写其他业务逻辑代码来完成一项具体的业务。
V: Struts框架中的视图主要由JSP文件构成,在JSP文件中可应用Struts标签和自定义标签来表现模型组件中的数据进行简单的处理。ActionForm Bean实际上是一个遵循了特殊约定的JavaBean,在Struts中ActionForm Bean可看作为一个中间存储器在视图与控制器之间进行数据传递。
94. struts如何实现国际化
以下以两国语言(中文,英文)为例:
》在工程中加入Struts支持
》 编辑ApplicationResource.properties文件,在其中加入要使用国际化的信息, 例如: lable.welcome.china=Welcome!!!
》创建英文资源文件ApplicationResource_en.properites
》创建临时中文资源文件ApplicationResource_temp.properites 例如:lable.welcom.china=中国欢迎您!
》对临时中文资源文件进行编码转换。可以使用myeclipse的插件,也可以在dos下执行:
native2ascii -encoding gb2312 ApplicationResource_temp.properties ApplicationResource_zh_CN.properties
》在jsp中加入struts的bean标记库
95. Struts框架的数据验证可分为几种类型?
表单验证(由ActionForm Bean处理):如果用户没有在表单中输入姓名,就提交表单,将生成表单验证错误
业务逻辑验证(由Action处理):如果用户在表单中输入的姓名为“Monster”,按照本应用的业务规则,不允许向“Monster”打招呼,因此将生成业务逻辑错误。
96. 简述Form Bean的表单验证流程。
1、当用户提交了HTML表单,Struts框架自动把表单数据组装到ActionForm Bean中。
2、接下来Struts框架会调用ActionForm Bean的validate()方法进行表单验证。
3、如果validate()方法返回的ActionErrors 对象为null,或者不包含任何ActionMessage对象,就表示没有错误,数据验证通过。
4、如果ActionErrors中包含ActionMessage对象,就表示发生了验证错误,Struts框架会把ActionErrors对象保存到request范围内,然后把请求转发到恰当的视图组件,视图组件通过<html:errors>标签把request范围内的ActionErrors对象中包含的错误消息显示出来,提示用户修改错误。
97. 简单叙述ActionForm Bean的作用
1、ActionForm Bean也是一种JavaBean,除了具有一些JavaBean的常规方法,还包含一些特殊的方法,用于验证HTML表单数据以及将其属性重新设置为默认值。
2、Struts框架利用ActionForm Bean来进行View组件和Controller组件之间表单数据的传递。
3、Struts框架把View组件接受到的用户输入的表单数据保存在ActionForm Bean中,把它传递给Controller组件,Controller组件可以对ActionForm Bean中的数据进行修改JSP文件使用Struts标签读取修改后的ActionForm Bean的信息,重新设置HTML表单。
98. Struts优缺点
优点:
1. 实现MVC模式,结构清晰,使开发者只关注业务逻辑的实现.
2.有丰富的tag可以用 ,Struts的标记库(Taglib),如能灵活动用,则能大大提高开发效率
3. 页面导航
使系统的脉络更加清晰。通过一个配置文件,即可把握整个系统各部分之间的联系,这对于后期的维护有着莫大的好处。尤其是当另一批开发者接手这个项目时,这种优势体现得更加明显。
4. 提供Exception处理机制 .
5. 数据库链接池管理
6. 支持I18N
缺点
1. 转到展示层时,需要配置forward,如果有十个展示层的jsp,需要配置十次struts,而且还不包括有时候目录、文件变更,需要重新修改forward,注意,每次修改配置之后,要求重新部署整个项目,而tomcate这样的服务器,还必须重新启动服务器
2. Struts 的Action必需是thread-safe方式,它仅仅允许一个实例去处理所有的请求。所以action用到的所有的资源都必需统一同步,这个就引起了线程安全的问题。
3. 测试不方便. Struts的每个Action都同Web层耦合在一起,这样它的测试依赖于Web容器,单元测试也很难实现。不过有一个Junit的扩展工具Struts TestCase可以实现它的单元测试。
4. 类型的转换. Struts的FormBean把所有的数据都作为String类型,它可以使用工具Commons-Beanutils进行类型转化。但它的转化都是在Class级别,而且转化的类型是不可配置的。类型转化时的错误信息返回给用户也是非常困难的。
5. 对Servlet的依赖性过强. Struts处理Action时必需要依赖ServletRequest 和ServletResponse,所有它摆脱不了Servlet容器。
6. 前端表达式语言方面.Struts集成了JSTL,所以它主要使用JSTL的表达式语言来获取数据。可是JSTL的表达式语言在Collection和索引属性方面处理显得很弱。
7. 对Action执行的控制困难. Struts创建一个Action,如果想控制它的执行顺序将会非常困难。甚至你要重新去写Servlet来实现你的这个功能需求。
8. 对Action 执行前和后的处理. Struts处理Action的时候是基于class的hierarchies,很难在action处理前和后进行操作。
9. 对事件支持不够. 在struts中,实际是一个表单Form对应一个Action类(或DispatchAction),换一句话说:在Struts中实际是一个表单只能 对应一个事件,struts这种事件方式称为application event,application event和component event相比是一种粗粒度的事件
99. Hibernate框架的认识(工作原理)
Hibernate是一个轻量级的持久层开源框架,它是连接Java应用程序和关系数据库的中间件,负责Java对象和关系数据之间的映射.
Hibernate内部对JDBC API进行了封装,负责Java对象的持久化.
因为它封装了所有的数据访问细节,使得业务逻辑层可以专注于实现业务逻辑.
它是一种优秀的ORM映射工具,提供了完善的对象-关系映射服务,开发过程不依赖容器,灵活性非常大,可以无缝集成到任何一个java系统中
100. 为什么要用Hibernate
》封装了jdbc,简化了很多重复性代码。
》简化了DAO层编码工作,使开发更对象化了。
》移植性好,支持各种数据库,如果换个数据库只要在配置文件中变换配置就可以了,不用改变hibernate代码。
》支持透明持久化,因为hibernate操作的是纯粹的(pojo)java类,没有实现任何接口,没有侵入性。所以说它是一个轻量级框架。
101. 对象的3个状态
》瞬时:一个实体通过new操作符创建后,没有和Hibernate的Session建立关系,也没有手动赋值过该实体的持久化标识(持久化标识可以认为映射表的主键)。此时该实体中的任何属性的更新都不会反映到数据库表中。
》持久化:当一个实体和Hibernate的Session创建了关系,并获取了持久化标识,而且在Hibernate的Session生命周期内存在。此时针对该实体任何属性的更改都会直接影响到数据库表中一条记录对应字段的更新,也即与对应数据库表保持同步。
》脱管:当一个实体和Hibernate的Session创建了关系,并获取了持久化标识,
而此时Hibernate的Session的生命周期结束,实体的持久化标识没有被改动过。
针对该实体的任何属性的修改都不会及时反映到数据库表中。
102. JDBC,Hibernate,EJB三者的区别?
EJB:我们必须遵守复杂的J2EE规范,Hibernate不强迫必须满足特定的规范.EJB只能运行在EJB容器中,Hibernate可以运行在任何java环境中.目前,对于复杂的域模型,EJB容器提供的对象-关系映射能力有限.相比之下,Hibernate提供了完善的对象-关系映射服务.EJB虽然是一种可以移植的组件,但是实际上却受到很大的限制,因为各个产商生产CMP引擎差异,它们使用的对象-关系映射元数据各不相同,使得EJB不能顺利的从一个EJB容器移植到另一个EJB容器当中.而Hibernate可以无缝集成到任何一个Java系统中.JDBC:实现业务逻辑的代码和访问数据库的代码混杂在一起,使程序结构不清晰,可读性差
103. hibernate的核心类是什么,它们的相互关系是什么?重要的方法是什么?
Configuration 接口:配置Hibernate,根据其启动hibernate,创建SessionFactory 对象;
SessionFactory 接口:初始化Hibernate,充当数据存储源的代理,创建session 对象,sessionFactory 是线程安全的,意味着它的同一个实例可以被应用的多个线程共享,是重量级、二级缓存;
Session 接口:负责保存、更新、删除、加载和查询对象,是线程不安全的,避免多个线程共享同一个session,是轻量级、一级缓存;
Session如下方法: save,load,update,delete,
Query q=CreateQuery(“from Customer where customerName=:customerName”)
beginTransaction, close, transaction, commit
Transaction 接口:管理事务;
Query 和Criteria 接口:执行数据库的查询。
104. Spring 注解
Spring 2.5 中除了提供 @Component 注释外,还定义了几个拥有特殊语义的注释,它们分别是:@Repository、@Service 和 @Controller。在目前的 Spring 版本中,这 3 个注释和 @Component 是等效的,但是从注释类的命名上,很容易看出这 3 个注释分别和持久层、业务层和控制层(Web 层)相对应。虽然目前这 3 个注释和 @Component 相比没有什么新意,但 Spring 将在以后的版本中为它们添加特殊的功能。所以,如果 Web 应用程序采用了经典的三层分层结构的话,最好在持久层、业务层和控制层分别采用
@Repository、@Service 和 @Controller 对分层中的类进行注释,而用 @Component 对那些比较中立的类进行注释。
在 一个稍大的项目中,通常会有上百个组件,如果这些组件采用xml的bean定义来配置,显然会增加配置文件的体积,查找以及维护起来也不太方便。 Spring2.5为我们引入了组件自动扫描机制,他可以在类路径底下寻找标注了 @Component,@Service,@Controller,@Repository注解的类,并把这些类纳入进spring容器中管理。它的作用 和在xml文件中使用bean节点配置组件时一样的。
@Service用于标注业务层组件,
@Controller用于标注控制层组件(如struts中的action),
@Repository用于标注数据访问组件,即DAO组件,
@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。
105. spring 的优点都有哪些?
1.降低了组件之间的耦合性 ,实现了软件各层之间的解耦
2.可以使用容易提供的众多服务,如事务管理,消息服务等
3.容器提供单例模式支持
4.容器提供了AOP技术,利用它很容易实现如权限拦截,运行期监控等功能
5.容器提供了众多的辅助类,能加快应用的开发
6.spring对于主流的应用框架提供了集成支持,如hibernate,JPA,Struts等
7.spring属于低侵入式设计,代码的污染极低
8.独立于各种应用服务器
9.spring的DI机制降低了业务对象替换的复杂性
10.Spring的高度开放性,并不强制应用完全依赖于Spring,开发者可以自由选择spring的部分或全部
106. Spring里面如何配置数据库驱动?
使用”org.springframework.jdbc.datasource.DriverManagerDataSource”数据源来配置数据库驱动。
107. Spring里面applicationContext.xml文件能不能改成其他文件名?
ContextLoaderListener是一个ServletContextListener, 它在你的web应用启动的时候初始化。缺省情况下, 它会在WEB-INF/applicationContext.xml文件找Spring的配置。 你可以通过定义一个元素名字为”contextConfigLocation”来改变Spring配置文件的位置。示例如下:
org.springframework.web.context.ContextLoaderListener contextConfigLocation /WEB-INF/xyz.xml
108. AOP里面重要的几个名词概念解释
切面(Aspect): 一个关注点的模块化,这个关注点可能会横切多个对象。事务管理是J2EE应用中一个关于横切关注点的很好的例子。 在Spring AOP中,切面可以使用通用类(基于模式的风格) 或者在普通类中以 @Aspect 注解(@AspectJ风格)来实现。
连接点(Joinpoint): 在程序执行过程中某个特定的点,比如某方法调用的时候或者处理异常的时候。 在Spring AOP中,一个连接点 总是 代表一个方法的执行。 通过声明一个org.aspectj.lang.JoinPoint类型的参数可以使通知(Advice)的主体部分获得连接点信息。
通知(Advice): 在切面的某个特定的连接点(Joinpoint)上执行的动作。通知有各种类型,其中包括“around”、“before”和“after”等通知。 通知的类型将在后面部分进行讨论。许多AOP框架,包括Spring,都是以拦截器做通知模型, 并维护一个以连接点为中心的拦截器链。
切入点(Pointcut): 匹配连接点(Joinpoint)的断言。通知和一个切入点表达式关联,并在满足这个切入点的连接点上运行(例如,当执行某个特定名称的方法时)。 切入点表达式如何和连接点匹配是AOP的核心:Spring缺省使用AspectJ切入点语法。
引入(Introduction): (也被称为内部类型声明(inter-type declaration))。声明额外的方法或者某个类型的字段。 Spring允许引入新的接口(以及一个对应的实现)到任何被代理的对象。 例如,你可以使用一个引入来使bean实现 IsModified 接口,以便简化缓存机制。
目标对象(Target Object): 被一个或者多个切面(aspect)所通知(advise)的对象。也有人把它叫做 被通知(advised) 对象。 既然Spring AOP是通过运行时代理实现的,这个对象永远是一个 被代理(proxied) 对象。
AOP代理(AOP Proxy): AOP框架创建的对象,用来实现切面契约(aspect contract)(包括通知方法执行等功能)。 在Spring中,AOP代理可以是JDK动态代理或者CGLIB代理。 注意:Spring 2.0最新引入的基于模式(schema-based)风格和@AspectJ注解风格的切面声明,对于使用这些风格的用户来说,代理的创建是透明的。
织入(Weaving): 把切面(aspect)连接到其它的应用程序类型或者对象上,并创建一个被通知(advised)的对象。 这些可以在编译时(例如使用AspectJ编译器),类加载时和运行时完成。 Spring和其他纯Java AOP框架一样,在运行时完成织入。
通知的类型:
前置通知(Before advice): 在某连接点(join point)之前执行的通知,但这个通知不能阻止连接点前的执行(除非它抛出一个异常)。
返回后通知(After returning advice): 在某连接点(join point)正常完成后执行的通知:例如,一个方法没有抛出任何异常,正常返回。
抛出异常后通知(After throwing advice): 在方法抛出异常退出时执行的通知。
后通知(After (finally) advice): 当某连接点退出的时候执行的通知(不论是正常返回还是异常退出)。
环绕通知(Around Advice): 包围一个连接点(join point)的通知,如方法调用。这是最强大的一种通知类型。 环绕通知可以在方法调用前后完成自定义的行为。它也会选择是否继续执行连接点或直接返回它们自己的返回值或抛出异常来结束执行。
环绕通知是最常用的一种通知类型。大部分基于拦截的AOP框架,例如Nanning和JBoss4,都只提供环绕通知。
切入点(pointcut)和连接点(join point)匹配的概念是AOP的关键,这使得AOP不同于其它仅仅提供拦截功能的旧技术。 切入点使得定位通知(advice)可独立于OO层次。 例如,一个提供声明式事务管理的around通知可以被应用到一组横跨多个对象中的方法上(例如服务层的所有业务操作)。
109. Action是不是线程安全的?如果不是 有什么方式可以保证Action的线程安全?如果是,说明原因
Action不是线程安全的,不定义类的域,就可以避免线程问题
110. logic标签有哪几个?
此标签库可以分为三种类型:条件、循环、转发/重定向。
(1) 条件类型 (没标注的都比较简单)
logic:empty, logic:notEmpty;
logic:equal, logic:notEqual, logic:lessThan,
logic:greaterThan,logic:lessEqual, logic:greaterEqual;
logic:present, logic:notPresent;
logic:match, logic:notMatch; 比较两字符串是否相等,可以比较字符串的开始
的、结尾的或其中的某个部分。location属性:指定从某个位置开始进行比较。
(2) 循环类型
logic:iterate
(3)转发/重定向类型
logic:forward和logic:redirect
logic:forward标签和jsp:forward标签相似,但它可以使用global forward中的一
个ActionForward
例如:与上面相关的global forward中的代码:
logic:redirect标签和上面的标签类似,但它默认调用的方法是
response.sendRedirect(),
取代了上面的requestDispatcher.forward()。最大的不同是它支持所有html:link
标签的属性,所以你能够指定request参数:
在MVC框架下,不推荐使用这两个标签,你应该是从controller中选择下一个
view,而不是从view中选择.在Jsp页面中不要过多的使用logic标签。
111. action是单实例还是多实例,为什么?
action是单实例的。当多个用户访问一个请求的时候,服务器内存中只有一个与之对应的action类对象。因为当服务器第一次加载struts的配置文件的时候,创建了一个Action后,每发送一个请求,服务器都会先去检索相应的范围内(request,session)是否存在这样一个action实例,如果存在,则使用这个实例,如果不存在,则创建一个action实例。
112. dispatchAction是用什么技术实现的?
DispatchAction 是Aciton的一个子类,主要解决了一个请求处理多个功能的问题
普通的Action你只能写execute方法来处理业务,而想用这一个Action处理多个任
务,你必须要请求参数进行解析,用if语句块来处理
举一个小例子:
有如下一个url: http://localhost:8080/myApp/addUserAction.do
如果你处理这个url的是一个普通的Action,那么就只能在execute里面执行插入的
相关操作,如果换成一下url:http://localhost:8080/myApp/UserAction.do?method=add
你就应该根据method对象的值来执行相应的操作,如再有一个路径http://localhost:8080/myApp/UserAction.do?method=delete这个还可以使用那个Action来处理的,只是多判断一下而已.如果你用DispatchAction,就简单多了,所以dispatchAction还是用的Action的这么一个技术。
113. struts2.0的mvc模式?与struts1.0的区别?
struts2的mvc模式:当用户在页面提交用户请求时,该请求需要提交给struts2的控
制器处理。struts2的控制器根据处理结果,决定将哪个页面呈现给客户端。与struts1最大的不同是:struts2的控制器。struts2的控制器不再像struts1的控
制器,需要继承一个Action父类,甚至可以无需实现任何接口,struts2的Action就是一个普通的POJO。实际上,Struts2 的Action就是一个包含execute方法的普通Java类该类里包含的多个属性用于封装用户的请求参数。
114. STRUTS的配置文件是什么?
struts-config.xml
115. update()和saveOrUpdate()的区别?
update()和saveOrUpdate()是用来对跨Session的PO进行状态管理的。
update()方法操作的对象必须是持久化了的对象。也就是说,如果此对象在数据库中不存在的话,就不能使用update()方法。saveOrUpdate()方法操作的对象既可以使持久化了的,也可以使没有持久化的对象。如果是持久化了的对象调用saveOrUpdate()则会更新数据库中的对象;如果是未持久化的对象使用此方法,则save到数据库中。
116. hibernate的三种状态之间如何转换
当对象由瞬时状态(Transient)一save()时,就变成了持久化状态。当我们在Session里存储对象的时候,实际是在Session的Map里存了一份,也就是它的缓存里放了一份,然后,又到数据库里存了一份,在缓存里这一份叫持久对象(Persistent)。Session 一 Close()了,它的缓存也都关闭了,整个Session也就失效了,
这个时候,这个对象变成了游离状态(Detached),但数据库中还是存在的。当游离状态(Detached)update()时,又变为了持久状态(Persistent)。当持久状态(Persistent)delete()时,又变为了瞬时状态(Transient),此时,数据库中没有与之对应的记录。
117. hibernate拒绝连接、服务器崩溃的原因?最少写5个
1. db没有打开
2. 网络连接可能出了问题
3. 连接配置错了
4. 驱动的driver,url是否都写对了
5. LIB下加入相应驱动,数据连接代码是否有误
6. 数据库配置可能有问题
7. 当前联接太多了,服务器都有访问人数限制的
8. 服务器的相应端口没有开,即它不提供相应的服务
118. Hibernate介绍
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。
Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。
Hibernate的核心接口一共有5个,分别为:Session、SessionFactory、
Transaction、Query和Configuration。这5个核心接口在任何开发中都会用到。通过这些接口,不仅可以对持久化对象进行存取,还能够进行事务控制。下面对这五个核心接口分别加以介绍。
•Session接口:Session接口负责执行被持久化对象的CRUD操作(CRUD的任务是完成与数据库的交流,包含了很多常见的SQL语句。)。但需要注意的是Session对象是非线程安全的。同时,Hibernate的session不同于JSP应用中的HttpSession。这里当使用session这个术语时,其实指的是Hibernate中的session,而以后会将HttpSesion对象称为用户session。
•SessionFactory接口:SessionFactroy接口负责初始化Hibernate。它充当数
据存储源的代理,并负责创建Session对象。这里用到了工厂模式。需要注意的是SessionFactory并不是轻量级的,因为一般情况下,一个项目通常只需要一个
SessionFactory就够,当需要操作多个数据库时,可以为每个数据库指定一个
SessionFactory。
•Configuration接口:Configuration接口负责配置并启动Hibernate,创建
SessionFactory对象。在Hibernate的启动的过程中,Configuration类的实例首先
定位映射文档位置、读取配置,然后创建SessionFactory对象。
•Transaction接口:Transaction接口负责事务相关的操作。它是可选的,开发
人员也可以设计编写自己的底层事务处理代码。
•Query和Criteria接口:Query和Criteria接口负责执行各种数据库查询。它可
以使用HQL语言或SQL语句两种表达方式。
119. Hibernate源码中几个包的作用简要介绍
net.sf.hibernate.* 该包的类基本上都是接口类和异常类
net.sf.hibernate.cache.* JCS的实现类
net.sf.hibernate.cfg.* 配置文件读取类
net.sf.hibernate.collection.* Hibernate集合接口实现类,例如
List,Set,Bag等等,Hibernate之所以要自行编写集合接口实现类是为了支持
lazy loading
net.sf.hibernate.connection.* 几个数据库连接池的Provider
net.sf.hibernate.dialect.* 支持多种数据库特性,每个Dialect实现类代
表一种数据库,描述了该数据库支持的数据类型和其它特点,例如是否有
AutoIncrement,是否有Sequence,是否有分页sql等等
net.sf.hibernate.eg.* Hibernate文档中用到的例子
net.sf.hibernate.engine.* 这个包的类作用比较散
net.sf.hibernate.expression.* HQL支持的表达式
net.sf.hibernate.hq.* HQL实现
net.sf.hibernate.id.* ID生成器
net.sf.hibernate.impl.* 最核心的包,一些重要接口的实现类,如果
Session,SessionFactory,Query等
net.sf.hibernate.jca.* JCA支持,把Session包装为支持JCA的接口实现类
net.sf.hibernate.jmx.* 我不懂JMX,只知道JMX是用来编写App Server的
管理程序的,大概是JMX部分接口的实现,使得App Server可以通过JMX接口管理
Hibernate
net.sf.hibernate.loader.* 也是很核心的包,主要是生成sql语句的
net.sf.hibernate.lob.* Blob和Clob支持
net.sf.hibernate.mapping.* hbm文件的属性实现
net.sf.hibernate.metadata.* PO的Meta实现
net.sf.hibernate.odmg.* ODMG是一个ORM标准,这个包是ODMG标准的实现类
net.sf.hibernate.persister.* 核心包,实现持久对象和表之间的映射
net.sf.hibernate.proxy.* Proxy和Lazy Loading支持
net.sf.hibernate.ps.* 该包是PreparedStatment Cache
net.sf.hibernate.sql.* 生成JDBC sql语句的包
net.sf.hibernate.test.* 测试类,你可以用junit来测试Hibernate
net.sf.hibernate.tool.hbm2ddl.* 用hbm配置文件生成DDL
net.sf.hibernate.transaction.* Hibernate Transaction实现类
net.sf.hibernate.type.* Hibernate中定义的持久对象的属性的数据类型
net.sf.hibernate.util.* 一些工具类,作用比较散
net.sf.hibernate.xml.* XML数据绑定
120. 缓存管理
Hibernate 中提供了两级Cache,第一级别的缓存是Session级别的缓存,它是属于事务范围的缓存。这一级别的缓存由hibernate管理的,一般情况下无需进行干预;第二级别的缓存是SessionFactory级别的缓存,它是属于进程范围或群集范围的缓存。这一级别的缓存可以进行配置和更改,并且可以动态加载和卸载。Hibernate还为查询结果提供了一个查询缓存,它依赖于第二级缓存。
1. 一级缓存和二级缓存的比较:第一级缓存 第二级缓存 存放数据的形式 相
互关联的持久化对象 对象的散装数据 缓存的范围 事务范围,每个事务都有单独
的第一级缓存进程范围或集群范围,缓存被同一个进程或集群范围内的所有事务共享 并发访问策略由于每个事务都拥有单独的第一级缓存,不会出现并发问题,无需提供并发访问策略由于多个事务会同时访问第二级缓存中相同数据,因此必须提供适当的并发访问策略,来保证特定的事务隔离级别 数据过期策略没有提供数据过期策略。处于一级缓存中的对象永远不会过期,除非应用程序显式清空缓存或者清除特定的对象必须提供数据过期策略,如基于内存的缓存中的对象的最大数目,允许对象处于缓存中的最长时间,以及允许对象处于缓存中的最长空闲时间 物理存储介质内存内存和硬盘。对象的散装数据首先存放在基于内在的缓存中,当内存中对象的数目达到数据过期策略中指定上限时,就会把其余的对象写入基于硬盘的缓存中。缓存的软件实现
在Hibernate的Session的实现中包含了缓存的实现由第三方提供,Hibernate仅提供了缓存适配器(CacheProvider)。用于把特定的缓存插件集成到Hibernate中。启用缓存的方式只要应用程序通过Session接口来执行保存、更新、删除、加载和查询数据库数据的操作,Hibernate就会启用第一级缓存,把数据库中的数据以对象的形式拷贝到缓存中,对于批量更新和批量删除操作,如果不希望启用第一级缓存,可以绕过Hibernate API,直接通过JDBC API来执行指操作。用户可以在单个类或类的单个集合的粒度上配置第二级缓存。如果类的实例被经常读但很少被修改,就可以考虑使用第二级缓存。只有为某个类或集合配置了第二级缓存,Hibernate在运行时才会把它的实例加入到第二级缓存中。
用户管理缓存的方式第一级缓存的物理介质为内存,由于内存容量有限,必须通过恰当的检索策略和检索方式来限制加载对象的数目。Session的evit()方法可以显式清空缓存中特定对象,但这种方法不值得推荐。 第二级缓存的物理介质可以是内存和硬盘,因此第二级缓存可以存放大量的数据,数据过期策略的maxElementsInMemory属性值可以控制内存中的对象数目。管理第二级缓存主要包括两个方面:选择需要使用第二级缓存的持久类,设置合适的并发访问策略:选择缓存适配器,设置合适的数据过期策略。
2. 一级缓存的管理: 当应用程序调用Session的save()、update()、
savaeOrUpdate()、get()或load(),以及调用查询接口的 list()、iterate()或
filter()方法时,如果在Session缓存中还不存在相应的对象,Hibernate就会把该
对象加入到第一级缓存中。当清理缓存时,Hibernate会根据缓存中对象的状态变
化来同步更新数据库。 Session为应用程序提供了两个管理缓存的方法:
evict(Object obj):从缓存中清除参数指定的持久化对象。 clear():清空缓存
中所有持久化对象。
3. 二级缓存的管理:
3.1. Hibernate的二级缓存策略的一般过程如下:
1) 条件查询的时候,总是发出一条select * from table_name where ….
(选择所有字段)这样的SQL语句查询数据库,一次获得所有的数据对象。
2) 把获得的所有数据对象根据ID放入到第二级缓存中。
3) 当Hibernate根据ID访问数据对象的时候,首先从Session一级缓存中查;
查不到,如果配置了二级缓存,那么从二级缓存中查;查不到,再查询数据库,把结果按照ID放入到缓存。
4) 删除、更新、增加数据的时候,同时更新缓存。
Hibernate的二级缓存策略,是针对于ID查询的缓存策略,对于条件查询则毫
无作用。为此,Hibernate提供了针对条件查询的Query Cache。
3.2. 什么样的数据适合存放到第二级缓存中? 1 很少被修改的数据 2 不是
很重要的数据,允许出现偶尔并发的数据 3 不会被并发访问的数据 4 参考数据,
指的是供应用参考的常量数据,它的实例数目有限,它的实例会被许多其他类的实例引用,实例极少或者从来不会被修改。
3.3. 不适合存放到第二级缓存的数据? 1 经常被修改的数据 2 财务数据,
绝对不允许出现并发 3 与其他应用共享的数据。
3.4. 常用的缓存插件 Hibernater 的二级缓存是一个插件,下面是几种常用
的缓存插件:
EhCache:可作为进程范围的缓存,存放数据的物理介质可以是内存或硬盘,对Hibernate的查询缓存提供了支持。
OSCache:可作为进程范围的缓存,存放数据的物理介质可以是内存或硬盘,提供了丰富的缓存数据过期策略,对Hibernate的查询缓存提供了支持。
SwarmCache:可作为群集范围内的缓存,但不支持Hibernate的查询缓存。
JBossCache:可作为群集范围内的缓存,支持事务型并发访问策略,对
Hibernate的查询缓存提供了支持。
3.5. 配置二级缓存的主要步骤:
1) 选择需要使用二级缓存的持久化类,设置它的命名缓存的并发访问策略。
这是最值得认真考虑的步骤。
2) 选择合适的缓存插件,然后编辑该插件的配置文件。