java中三大框架和项目模拟面试题目(2)

2019-03-16 22:21

前 session 对象中的所有属性

application :该 Map 中包含当前 application 对象中的所有属性

attr:该 Map 按如下顺序来检索某个属性: request, session, application

6)使用OGNL访问值栈的内容时,不需要#号,而访问request、session、application、attr时,需要加#号;

7)注意: Struts2中,OGNL表达式需要配合Struts标签才可以使用。如:

8)在struts2配置文件中引用ognl表达式 ,引用值栈的值 ,此时使用的\,而不是#或者%;

1.12. ActionContext、ServletContext、pageContext区别?

1)ActionContext是当前的Action的上下文环境,通过ActionContext可以获取到request、session、ServletContext等与Action有关的对象的引用;

2)ServletContext是域对象,一个web应用中只有一个ServletContext,生命周期伴随整个web应用;

3)pageContext是JSP中的最重要的一个内置对象,可以通过pageContext获取其他域对象的应用,同时它是一个域对象,作用范围只针对当前页面,当前页面结束时,pageContext销毁, 生命周期是JSP四个域对象中最小的。

1.13. resul的type属性中有哪些结果类型?

dispatcher struts默认的结果类型,把控制权转发给应用程序里的某个资源不能把控制权转发给一个外部资源,若需要把控制权重定向到一个外部资源, 应该使用 redirect 把响应重定向到另一个资源(包括一个外部资源) redirectAction 把响应重定向到另一个 Action

freemarker、velocity、chain、httpheader、xslt、plainText、stream

struts2-json-plugin 自定义 json 结果类型,用于返回json格式数据

1.14. 拦截器的生命周期与工作过程

1)每个拦截器都是实现了Interceptor接口的 Java 类;

2)init(): 该方法将在拦截器被创建后立即被调用, 它在拦截器的生命周期内只被调用一次. 可以在该方法中对相关资源进行必要的初始化;

3)intercept(ActionInvocation invocation): 每拦截一个动作请求, 该方法就会被调用一次; 4)destroy: 该方法将在拦截器被销毁之前被调用, 它在拦截器的生命周期内也只被调用一次;

2. Hibernate3 框架题目

2.1. 为什么要使用Hibernate框架?它有什么优势?

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

代码。

? Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现,它很大程度

的简化了DAO层编码工作。

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

? 因为它是一个轻量级框架。映射的灵活性很出色。它支持很多关系型数据库,从一对一

到多对多的各种复杂关系。

2.2. Hibernate工作原理(编程步骤)

1.读取并解析Hibernate核心配置文件hibernate.cfg.xml 2.读取并解析Hibernate映射文件,创建SessionFactory 3.打开Sesssion yantingxin 4.创建事务Transation 5.持久化操作 6.提交事务 7.关闭Session

8.关闭SesstionFactory

2.3. Hibernate是如何实现延迟加载的?

延迟加载机制是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作。在Hibernate中提供了对实体对象的延迟加载、对集合的延迟加载和对属性的延迟加载。

当Hibernate在查询数据的时候,数据并没有存储在内存中,只是使用Javassist为目标类创建子类代理对象,当程序真正对数据的进行操作时,代理对象的handler才去访问数据,加载对象存在于内存中,这就实现了延迟加载,它节省了服务器的内存开销,从而提高了服务器的性能。

2.4. Hibernate 有那几种查询方式

(1) 导航对象图查询

(2) OID查询 (3) HQL查询 (4) QBC查询

(5) 本地SQL查询

2.5. Hibernate中load方法和get方法区别

区别1:如果数据库中没有userId对应的记录,通过get方法加载,则返回的是null值;如果通过load方法加载,则返回一个代理对象,当通过user对象调用某个方法(比如user.getPassword())时,会抛出异常:org.hibernate.ObjectNotFoundException;

区别2:load支持延迟加载,get不支持延迟加载。

2.6. Hibernate持久化对象有几种状态?

临时状态、游离状态、持久化状态

2.7. HQL和SQL语句的区别?

HQL面向对象,而SQL操纵关系型数据库

2.8. 说下Hibernate的缓存机制

缓存是介于应用程序和物理数据源之间,其作用是为了降低应用程序对物理数据源访问的频次,从而提高了应用的运行性能。

Hibernate的缓存包括Session的缓存和SessionFactory的缓存,其中SessionFactory的缓存又可以分为两类:内置缓存和外置缓存。Session的缓存是内置的,不能被卸载,也被称为Hibernate的第一级缓存。SessionFactory的内置缓存和Session的缓存在实现方式上比较相似,前者是SessionFactory对象的一些集合属性包含的数据,后者是指Session的一些集合属性包含的数据。SessionFactory的内置缓存中存放了映射元数据和预定义SQL语句,映射元数据是映射文件中数据的拷贝,而预定义SQL语句是在Hibernate初始化阶段根据映射元数据推导出来,SessionFactory的内置缓存是只读的,应用程序不能修改缓存中的映射元数据和预定义SQL语句,因此SessionFactory不需要进行内置缓存与映射文件的同步。SessionFactory的外置缓存是一个可配置的插件。在默认情况下,SessionFactory不会启用这个插件。外置缓存的数据是数据库数据的拷贝,外置缓存的介质可以是内存或者硬盘。SessionFactory的外置缓存也被称为Hibernate的第二级缓存。

2.9. 如何优化Hibernate?

初用HIBERNATE的人也许都遇到过性能问题,实现同一功能,用HIBERNATE与用JDBC性能相差十几倍很正常,如果不及早调整,很可能影响整个项目的进度。

大体上,对于HIBERNATE性能调优的主要考虑点如下: ? 数据库设计调整 ? HQL优化

? API的正确使用(如根据不同的业务类型选用不同的集合及查询API) ? 主配置参数(日志,查询缓存,fetch_size, batch_size等)

? 映射文件优化(ID生成策略,二级缓存,延迟加载,关联优化) ? 一级缓存的管理

? 针对二级缓存,还有许多特有的策略 ? 事务控制策略。

1、 数据库设计

a) 降低关联的复杂性 b) 尽量不使用联合主键

c) ID的生成机制,不同的数据库所提供的机制并不完全一样 d) 适当的冗余数据,不过分追求高范式 2、 HQL优化

HQL如果抛开它同HIBERNATE本身一些缓存机制的关联,HQL的优化技巧同普通的SQL优化技巧一样,可以很容易在网上找到一些经验之谈。

在性能瓶颈的地方使用硬编码的 JDBC。 3、 主配置

a) 查询缓存,同下面讲的缓存不太一样,它是针对HQL语句的缓存,即完全一样的语句再次执行时可以利用缓存数据。但是,查询缓存在一个交易系统(数据变更频繁,查询条件相同的机率并不大)中可能会起反作用:它会白白耗费大量的系统资源但却难以派上用场。 b) fetch_size,同JDBC的相关参数作用类似,参数并不是越大越好,而应根据业务特征去设置

c) batch_size同上。

d) 生产系统中,切记要关掉SQL语句打印。 4、 缓存

a) 数据库级缓存:这级缓存是最高效和安全的,但不同的数据库可管理的层次并不一样,比如,在ORACLE中,可以在建表时指定将整个表置于缓存当中。 b) SESSION缓存:在一个HIBERNATE SESSION有效,这级缓存的可干预性不强,大多于HIBERNATE自动管理,但它提供清除缓存的方法,这在大批量增加/更新操作是有效的。比如,同时增加十万条记录,按常规方式进行,很可能会发现OutofMemeroy的异常,这时可能需要手动清除这一级缓存:Session.evict以及Session.clear

c) 应用缓存:在一个SESSIONFACTORY中有效,因此也是优化的重中之重,因此,各类策略也考虑的较多,在将数据放入这一级缓存之前,需要考虑一些前提条件: i. 数据不会被第三方修改(比如,是否有另一个应用也在修改这些数据?) ii. 数据不会太大

iii. 数据不会频繁更新(否则使用CACHE可能适得其反) iv. 数据会被频繁查询

v. 数据不是关键数据(如涉及钱,安全等方面的问题)。

缓存有几种形式,可以在映射文件中配置:read-only(只读,适用于很少变更的静态数据/历史数据),nonstrict-read-write,read-write(比较普遍的形式,效率一般),transactional(JTA中,且支持的缓存产品较少)

d) 分布式缓存:同c)的配置一样,只是缓存产品的选用不同,在目前的HIBERNATE中可供选择的不多,oscache, jboss cache,目前的大多数项目,对它们的用于集群的使用(特别是关键交易系统)都持保守态度。在集群环境中,只利用数据库级的缓存是最安全的。 5、 延迟加载

a) 实体延迟加载:通过使用动态代理实现

b) 集合延迟加载:通过实现自有的SET/LIST,HIBERNATE提供了这方面的支持 c) 属性延迟加载: 6、 方法选用

a) 完成同样一件事,HIBERNATE提供了可供选择的一些方式,但具体使用什么方式,可能用性能/代码都会有影响。显示,一次返回十万条记录(List/Set/Bag/Map等)进行处理,很可能导致内存不够的问题,而如果用基于游标(ScrollableResults)或Iterator的结果集,则不存在这样的问题。

b) Session的load/get方法,前者会使用二级缓存,而后者则不使用。

c) Query和list/iterator,如果去仔细研究一下它们,你可能会发现很多有意思的情况,二者主要区别(如果使用了Spring,在HibernateTemplate中对应find,iterator方法): i. list只能利用查询缓存(但在交易系统中查询缓存作用不大),无法利用二级缓存中的单个实体,但list查出的对象会写入二级缓存,但它一般只生成较少的执行SQL语句,很多情况就是一条(无关联)。

ii. iterator则可以利用二级缓存,对于一条查询语句,它会先从数据库中找出所有符合条件的记录的ID,再通过ID去缓存找,对于缓存中没有的记录,再构造语句从数据库中查出,因此很容易知道,如果缓存中没有任何符合条件的记录,使用iterator会产生N+1条SQL语句(N为符合条件的记录数)

iii. 通过iterator,配合缓存管理API,在海量数据查询中可以很好的解决内存问题,如: while(it.hasNext()){

YouObject object = (YouObject)it.next(); session.evict(youObject);

sessionFactory.evice(YouObject.class, youObject.getId()); }

如果用list方法,很可能就出OutofMemory错误了。

iv. 通过上面的说明,我想你应该知道如何去使用这两个方法了。 7、 集合的选用

在HIBERNATE 3.6文档的“21.5理解集合性能”中有详细的说明。 ? ists,maps 和 sets 用于更新效率最高 ? Bag 和 list 是反向集合类中效率最高的 ? 一次性删除(One shot delete)

8、 事务控制

事务方面对性能有影响的主要包括:事务方式的选用,事务隔离级别以及锁的选用


java中三大框架和项目模拟面试题目(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:湛江市教育信息化平台

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: