面试准备--SSH+一些基础知识


Hibernate
 
1,如何优化 Hibernate?
     ① 使用双向一对多关联,不使用单向一对多.
     ② 不用一对一,用多对一取代.
     ③ 配置对象缓存,不使用集合缓存.   
 
2,hibernate一级二级缓存
     一级缓存是Session级别的缓存,一个Session做了一个查询操作,它会把这个操作的结果放在一级缓存中,如果短时间内同一个session又做了同一个操作,那么hibernate直接从一级缓存中拿,而不会链接数据库.
     二级缓存是SessionFactory级别的缓存,把查询结果缓存到二级缓存中们如果同一个sessionFactory创建的某个session执行了相同的操作,hibernate就会从二级缓存中拿结果,而不会再去连接数据库.
 
3,请你谈谈你对OR映射的理解?
     将数据库里面的每一张表都映射成一个实体。
 
4,很多人说Hibernate不适合大项目,性能有问题,你是如何理解的?
     因为Hibernate属于大型框架,里面对许多方法的封装比较多,让SQL控制权降低。这样的话,适用性就会降低,在不必要的操作上会浪费时间。但是只要将Hibernate里的配置进行优化,也能提高其性能。
 
5,Hibernate为什么一定要定义一个数据库标识?(数据库对象的名称即为其标识符。 Microsoft SQL Server 中的所有内容都可以有标识符。 服务器、数据库和数据库对象(例如表、视图、列、索引、触发器、过程、约束及规则等)都可以有标识符。)
   可以让映射文件变得简洁,消除无用的噪音(比如TBL_前缀等)。Hibernate 使用的默认策略是几乎什么都不做,所以使用标识的作用就是使数据操作更加简洁和方便。
 
6,为什么Hibernate建议你的实体类实现hashCode和equals方法?
    因为Hibernate使用了一级和二级缓存,很多查询为了提高效率Hibernate都会先从缓存中进行查找,然后再从数据库进行查找。而HashCode是唯一的,所以这样避免数据操作出现数据混淆的可能,而equals的作用是对比Hibernate缓存中数据是否一致。
 
7,谈谈你对Hibernate实体类中的数据库标识与数据库主键之间关系的认识?
    数据库标识是为了方便和简洁映射文件,而主键是为了使数据不会重复。
 
8,谈谈你对Hibernate关联映射与数据库外键之间关系的认识?
    Hibernate在进行映射的时候会将数据库的关系也进行映射将数据库中的外键也使用标签的形式进行管理,这样在人为操作的时候就不需要手动的管理数据库关系了。
 
9,调用session.save()方法,hibernate一定会发出insert语句吗?谈谈你的理解
  调用session.update()方法,hibernate一定会发出update语句吗?谈谈你的理解
     不会,具体执行步骤如下:
     1. 首先在Session内部缓存中进行查找,如果发现则直接返回。
     2. 执行实体类对应的Interceptor.isUnsaved方法(如果有的话),判断对象是否为未保存状态。
     3. 根据unsaved-value判断对象是否处于未保存状态。
     4. 如果对象未保存(Transient状态),则调用save方法保存对象。
     5. 如果对象未已保存(Detached状态),则调用update方法将对象与Session重新关联。
 
10,请你聊一下以下名词、概念或用法:lazy,lazy=”extra”;inverse,fetch、fetch=”join”、fetch=”subselect”、batch-size ?
 
lazy 懒加载,lazy=“extra”extra属性是不大容易重视的,其实它和true差不多,但有个小的智能的地方是,即调用集合的size/contains等方法的时候,hibernate并不会去加载整个集合的数据,而是发出一条聪明的SQL语句,以便获得需要的值,只有在真正需要用到这些集合元素对象数据的时候,才去发出查询语句加载所有对象的数据。
inverse 控制翻转,主要是为了让谁去维护关系,一般是在主表中配置,将维护关系的只能交给主键。
fetch 取来,fetch="join"主要是在查询的时候Hibernate会自动查询有关联的表。fetch="join",hibernate会通过select 语句使用外连接来加载其关联实体或集合,此时lazy会失效
fetch="subselect",另外发送一条select语句抓取在前面查询到的所有实体对象的关联集合
batch-size配置这个属性是让Hibernate在执行批量的数据库操作
     
11,配置了lazy=”true”一定会实现懒加载吗?
不一定,因为如果再配置中你也使用fetch属性的话此时lazy就会失效。
 
 
Spring
1,为什么要用spring?
     (简介)Spring是一个轻量级的IOC和AOP框架。IOC(控制反转)将设计好的类交给系统去控制,而不是你的类内部控制。称为控制反转。AOP(面向切面),它将那些影响多个类的行为的封装到可重用的模块中,面向对象是把问题从同类事物中抽象出来,面向切面是把问题从不同类问题中抽象出来。
     ①,主要将各个框架进行有效的联系起来,缩短实际编程的时间,起一个润滑剂的作用。
     ②,将各个框架进行有效的管理和控制,让数据传输更安全。
 
2,请你聊一聊IOC(inversion of control)/DI(Dependency Injection)?
     依赖注入和控制反转是Spring的两大基础作用。主要是将所有组件在Spring提供的外部容器中加载,提高安全性,减低耦合性,使各个框架或者类之间的依赖性降低。
 
3,什么是声明式的事务管理?为什么要使用声明式的事务管理?Spring如何实现声明式的事务管理?
     声明事物管理主要是将在进行对数据库中数据进行添加或者修改的时候需要执行事物管理。主要是避免在执行数据修改和添加的时候数据添加或者修改不完全,导致数据丢失。Spring是使用AOP面向切面的思想进行事物管理的。
 
4,把spring和hibernate集成,定义事务管理特性的时候,为何要将除了添加、删除、更新操作之外的方法,即主要执行 查询任务的方法定义为read-only?
     可以提高效率,进行更加方便的事物管理。而事物管理主要是为添加和删除和更新设计的。
 
Struts2
1,struts2流程:   
    
 
 
2,为什么每次请求都要创建一个Action对象?
     struts2每次请求的时候都会创建一个action的实例,这样会保证线程的安全。struts1只是在第一次请求的时候创建一个action的实例,以后每次相同的请求都直接从内存中去读取,它是单例模式,安全性不行。
     
3,ModelDriven拦截器的配置中refreshModelBeforeResult解决了什么问题?    
   在数据输出之前将数据接收的Bean里面的数据清空。解决了数据混淆的可能性。
 
 
4,谈谈ValueStack?
 堆值,堆里面的值。Action中所有的属性都被封装到了ValueStack对象中,Action中的属性名可以理解为ValueStack中的value的名字
 
5,Struts2是如何实现MVC设计模式的?
   在Struts2里面是将每次页面的请求进行处理,然后将请求需要输出的数据转发的需要做数据显示的页面,Struts2只是起一个数据接受和转接的功能,就是Controler控制器,而传来数据的页面叫View显示层,Struts2将数据提交给进行处理的类叫Model模型层,专门进行数据处理和数据库的链接。


javaWEB:
    
 
OSI(Open System Interconnect)模型:
     OSI将计算机网络体系结构(architecture)划分为以下七层:
 
物理层: 将数据转换为可通过物理介质传送的电子信号 相当于
邮局中的搬运工人
数据链路层: 决定访问网络介质的方式
在此层将数据分帧,并处理流控制。本层 指定拓扑结构并提供硬件寻 址。相当于邮局中的装拆箱工人
网络层: 使用权数据路由经过大型网络 相当于邮局中的排序工人
传输层: 提供终端到终端的可靠连接 相当于公司中跑邮局的送信职员
会话层: 允许用户使用简单易记的名称建立连接 相当于公司中收寄信、写信封与拆信封的秘书
表示层: 协商数据交换格式 相当公司中简报老板、替老板写信的助理
应用层: 用户的应用程序和网络之间的接口 老板
 
 
 
socket通信:
      
 
Tcp协议的三次握手
      
 
单链表:
     
 
 
单向和双向链表的区别:
     
 
线程&进程
 
     进程:程序的一次运行活动(系统进行资源分配和调度的一个独立单位)。
     线程:进程的一个实体,是cpu调度和分派的基本单位。
         
posted @ 2013-11-13 10:40  zl_说不得  阅读(279)  评论(0编辑  收藏  举报