[置顶] HttpSession和HibernateSession的区别

时间:2022-05-01 13:54:21

转自:http://blog.csdn.net/aimbetter/article/details/36667797


总而言之HttpSession是服务器tomcat自动创建的一个容器,而Hibernate的Session相当于一个缓冲器


一、javax.servlet.http.HttpSession是一个抽象接口-------来自于tomcat的servlet.api

它的产生:J2EE的Web程序在运行的时候,会给每一个新的访问者建立一个HttpSession,这个Session是用户身份的唯一表示。注意,是容器(Tomcat,Resin)自动创建的。

用途:存放这个用户的一些经常被用到的信息,例如:用户名,权限。例如在购物车程序里,存放用户买的商品。

销毁:一定时间(跟容器有关)内,用户无任何动作,session自动销毁。

得到的方法: 
HttpSession session = request.getSession(); 
常用方法setAttribute 
session.setAttribute(key,value); 
这样在另一个jsp或者Servlet里,可以用 
session.getAttribute(key);得到value 
类似一个Map


我们来看一下它的源代码:

public interface HttpSession {
long getCreationTime();

String getId();

long getLastAccessedTime();

ServletContext getServletContext();

void setMaxInactiveInterval(int var1);

int getMaxInactiveInterval();

/** @deprecated */
HttpSessionContext getSessionContext();

Object getAttribute(String var1);

/** @deprecated */
Object getValue(String var1);

Enumeration<String> getAttributeNames();

/** @deprecated */
String[] getValueNames();

void setAttribute(String var1, Object var2);

/** @deprecated */
void putValue(String var1, Object var2);

void removeAttribute(String var1);

/** @deprecated */
void removeValue(String var1);

void invalidate();

boolean isNew();
}


二、org.hibernate.Session

它是hibernate操作数据库的一个句柄对象。它跟上面那个Session唯一的相似处就是名字有点像,其他没任何一样的地方。亦可以理解为数据库层和持久化层的互访载体,也可以认为是一个缓冲器,对数据库的所有CURD操作在这个session(缓存)中都有记录,一旦做个缓存commit操作,则所有对持久化对象的操作都将映射到具体的某个数据库中,完成最后的数据更新

一般的Hibernate程序中,Session由用户手动获取,手动关闭。 
正规项目中,在业务层获取Session 
Session session = HibernateSessionFactory.openSession();

然后把此session传给dao层,将数据持久化或其他的操作。 
一次业务逻辑可能调用多个dao方法,例如银行转帐,是一个先减后增的过程,所以会调用2个dao里的方法(甲帐户减,乙帐户增)。因此,可以利用业务层产生的同一个Session来做这件事

a1和a2代表帐户实体。 
a1是甲的,a2是乙的。 
a1.setAcount(a1.getAcount()-1000); 
a2.setAcount(a2.getAcount()+1000); 
dao.update(a1,session); 
dao.update(a2,session); 
Transaction tx = session.beginTransaction(); 
tx.commit();

最后在业务层,将session关闭 
session.close(); 
或者调用HibernateSessionFactory.closeSession(session);

最好能加上异常捕捉,之类,如产生异常,即时回滚。保证操作不出意外。

try{ 
... 
tx.commit(); 
}catch(Exception e){ 
tx.rollback(); 
}finally{ 
HibernateSessionFactory.closeSession(session); 
}

默认session的时间为20分钟,如果想在这之前清除的话可以使用Session.Abandorn方法

我们来看一下它的源代码

package org.hibernate;

import java.io.Serializable;
import java.sql.Connection;
import org.hibernate.jdbc.ReturningWork;
import org.hibernate.jdbc.Work;
import org.hibernate.stat.SessionStatistics;

public interface Session extends SharedSessionContract {
SharedSessionBuilder sessionWithOptions();

void flush() throws HibernateException;

void setFlushMode(FlushMode var1);

FlushMode getFlushMode();

void setCacheMode(CacheMode var1);

CacheMode getCacheMode();

SessionFactory getSessionFactory();

Connection close() throws HibernateException;

void cancelQuery() throws HibernateException;

boolean isOpen();

boolean isConnected();

boolean isDirty() throws HibernateException;
    LockMode getLockMode();

Session.LockRequest setLockMode(LockMode var1);

int getTimeOut();
  }