SSH总结

转载:http://zhxing.iteye.com/blog/306076

1.谈谈hibernate的延迟加载和openSessionInView

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

OpenSessionInView模式是Spring提供的一个针对Hibernate的一个支持类,其主要意思是在发起一个页面请求时打开Hibernate的Session,一直保持这个Session,直到这个请求结束。openSessionInView有两种实现方式:一种是过滤器,还有一种是拦截器。

大概过程是:一次请求->打开session->业务处理->页面渲染->关闭session->响应

2.session.load()和session.get()的区别

答:

(1)如果未能发现符合条件的记录,get方法返回null,而load方法会抛出一个ObejctNotFoundException。

(2)Load方法可返回实体的代理类类型

(3)Load方法可以充分利用内部缓存和二级缓存中现有数据,而get方法则仅仅在内部缓存中进行数据查找,如没有发现对应数据,将越过二级缓存,直接调用SQL完成数据读取。

3.spring的事务有几种方式?谈谈spring事务的隔离级别和传播行为。

答:声明事务和编程事务

隔离级别:

-DEFAULT使用数据库默认的隔离级别

-READ_UNCOMMITTED会出现脏读,不可重复读和幻影读问题

-READ_COMMITTED会出现重复读和幻影读

-REPEATABLE_READ会出现幻影读

-SERIALIZABLE最安全,但是代价最大,性能影响极其严重

和传播行:

-REQUIRED存在事务就融入该事务,不存在就创建事务

-SUPPORTS存在事务就融入事务,不存在则不创建事务

-MANDATORY存在事务则融入该事务,不存在,抛异常

-REQUIRES_NEW总是创建新事务

-NOT_SUPPORTED存在事务则挂起,一直执行非事务操作

-NEVER总是执行非事务,如果当前存在事务则抛异常

-NESTED嵌入式事务

4.谈谈对Struts的流程的理解。

答:Request->ActionServlet->如果不存在相应的Action则否则返回error,流程结束->创建ActionForm->进行validatge校验,如果没有通过校验则返回error->创建Action->执行Action的execute方法,并返回ActionForword对象->returnrespose->结束

5.谈谈ThreadLocal在spring框架中的作用

答:在管理request作用域的Bean、事务管理、任务调度、AOP等模块起着举足轻重的作用。(可参考个人博客上相关内容)

6.以前项目中有没有用到spring的AOP?具体用来做什么?

答:事务管理、日志、权限管理等。

7.谈谈对struts的MVC的理解。

答:view部分:由JSP页面充当,发起请求和等待请求处理后结果返回都通过JSP页面呈现给用户,struts提供了丰富的标签库,可以最大限度地减少脚本的使用。

controller部分:struts的控制器是分成2个部分:系统核心控制器、业务逻辑控制器。系统核心控制器为ActionServlet,负责拦截所有HTTP请求,然后根据用户请求决定是否需要调用业务逻辑控制器,如果需要则将请求转发给Action处理(继承Action类)。

model部分:由ActionForm和javabean组成。javabean封装了底层的业务逻辑。

8.Action是不是线程安全的?如果不是有什么方式可以保证Action的线程安全?如果是,说明原因

答:struts1不是,struts2是;

声明局部变量,或者扩展RequestProcessor,让每次都创建一个Action,或者在spring中用scope="prototype"来管理.

9.Hibernate有哪几种查询数据的方式

答:hql查询,sql查询,条件查询

10.Hibernate中的update()和saveOrUpdate()的区别.

答:摘自hibernate说明文档:

saveOrUpdate()做下面的事:

如果对象已经在本session中持久化了,不做任何事

如果另一个与本session关联的对象拥有相同的持久化标识(identifier),抛出一个异常

如果对象没有持久化标识(identifier)属性,对其调用save()

如果对象的持久标识(identifier)表明其是一个新实例化的对象,对其调用save()

如果对象是附带版本信息的(通过<version>或<timestamp>)并且版本属性的值表明其是一个新实例化的对象,save()它。

否则update()这个对象

11.Spring对多种ORM框架提供了很好的支持,简单描述在Spring中使用Hibernate的方法,并结合事务管理。

答:getHiberanteTemplate里面提供了save,update,delete,find等方法。

简单说一个:如果配置了声明式事务,当执行getHibernateTemplate的各种方法的时候,事务会自动被加载;如果没有配置事务,那么以上操作不会真正的被同步到数据库,除非配置了hibernate的autocommit=true。

12、Spring 中对hibernate session 的管理

答:在ssh架构中,常用继承HibernateDaoSupport来写Dao 类。Spring 提供了对hibernate session 的管理。我做了个尝试,看下面的代码:

public class UserHibernateDao extends HibernateDaoSupport implements UserDao{   
  

    public void test(T entity) {   


                     Session session1=this.getSession();   


         Session session2=this.getSession();   

                     System.out.println(session1==session2);   
                }   
}  
public class UserHibernateDao extends HibernateDaoSupport implements UserDao{

	public void test(T entity) {
                     Session session1=this.getSession();
	     Session session2=this.getSession();
                     System.out.println(session1==session2);
                }
}

 如果开启了事务的话,后台打印的是true,如果没有开启事务的话,后台打印的是 false,

可以看出,Spring 在有事务管理的时候,在同一个事务中,是用的一个session。通过查看源码可知道,Spring 是用这个类SessionFactoryUtils 调用SessionHolder来管理的,看一下源码。

public class SessionHolder extends ResourceHolderSupport {   
  

    private static final Object DEFAULT_KEY = new Object();   

  

    /**  
     * This Map needs to be synchronized because there might be multi-threaded  
     * access in the case of JTA with remote transaction propagation.  
     */  

//注意这里,Session 是放置在一个Map 容器里的   


    private final Map sessionMap = Collections.synchronizedMap(new HashMap(1));   

  

    private Transaction transaction;   

  

    private FlushMode previousFlushMode;   

  
  

    public SessionHolder(Session session) {   

        addSession(session);   
    }   
  

    public SessionHolder(Object key, Session session) {   

        addSession(key, session);   
    }   
  
  

    public Session getSession() {   


        return getSession(DEFAULT_KEY);   

    }   
  

    public Session getSession(Object key) {   


        return (Session) this.sessionMap.get(key);   

    }   
}  

相关推荐