`
haofeng82
  • 浏览: 141025 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

在任何地方获取多数据源hibernate session 的方法

阅读更多

原理:基于threadLocal:

使用hibernate,我们最终要获得的是一个hibernate session对象,

在第一次使用到一个hibernate Session的时候,创建创建一个session,并将其存储到threadLocal map集合中。

在同一个请求中,如果我们还需要用到这个session.我们就可以从threadLocal map集合中获取到这个session.接着使用。

在请求结束时(可以使用filter),关闭并清除ThreadLocal Map 中的所有session对象。

优点:可以配置多个数据源;可以在一个请求中在任何地方获取到hibernate session 对象;无需手工关闭hibernate session对象。

缺点:hibernate session 存活时间较长;我没详细测试过,只是理论上可行。

下面是代码:

1 HSessionHolder.java:用于获取到对应的session.

package com.hf.hibernate.util;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import org.apache.log4j.Logger;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

/**
*
* @author Administrator
*
*/
public class HSessionHolder {
private static Logger logger = Logger.getLogger(HSessionHolder.class);
/**
* threadLocal集合,对应了不同的配置文件
*/
private static Map <String ,ThreadLocal<Session>> threadLocalMap =new HashMap <String ,ThreadLocal<Session>>();
/**
* 配置文件名称-路径集合
*/
private static Map <String ,String> configFileLocationMap =new HashMap <String ,String>();

/**
* Hibernate SessionFactory 名称-对象集合
*/
private static Map <String ,SessionFactory> sessionFactoryMap =new HashMap <String ,SessionFactory>();
/**
* hibernate配置文件读取器
*/
private static final Configuration cfg = new Configuration();
/**
*
*/
private static final String DEFAULT_FLAG = "configOne";
/**
* 初始化配置文件集合
*/
static {
/**
* 初始化配置文件集合
*/
String configOneFlag="configOne";
String configOnePath="/com/hf/hibernate/config/hibernate.cfg.xml";
configFileLocationMap.put(configOneFlag,configOnePath);
/**
* 初始化threadLocalMap集合
*/
ThreadLocal<Session> configOneT = new ThreadLocal<Session>();
threadLocalMap.put(configOneFlag,configOneT);

/**
* 初始化各个sessionFactory对象
*/
Iterator configIterator =configFileLocationMap.keySet().iterator();
while(configIterator.hasNext()){
String configFlag = (String) configIterator.next();
String configPath = configFileLocationMap.get(configOneFlag);


cfg.configure(configPath);
SessionFactory sessionFactory = cfg.buildSessionFactory();
sessionFactoryMap.put(configFlag, sessionFactory);
}


}//static

/**
* 获取默认数据库的会话对象
* @param flag
* @return
*/
public static Session getSession() {
String flag= DEFAULT_FLAG;
return getSession(flag);

}

/**
* 关闭所有可能已经打开的hibernate会话
* @return
*/
public static void closeSessions() {
/**
* 遍历所有的threadLocalMap的成员,如果存在Session,则关掉。
*/
Iterator<String> threadLocalIterator =threadLocalMap.keySet().iterator();
while(threadLocalIterator.hasNext()){
ThreadLocal<Session> t =threadLocalMap.get(threadLocalIterator.next());
Session session = t.get();
if(session!=null){
session.close();
t.set(null);
logger.info("成功的关闭了一个hibernate Session,并清空ThreadLocal");
}

}
}

/**
* 获取制定数据库的会话对象
* @param flag
* @return
*/
public static Session getSession(String flag) {
/**
* 取到threadLocal
*/
ThreadLocal<Session> t = threadLocalMap.get(flag);
if(t==null){
try {
throw new Exception("无效的threadlocal 标志");
} catch (Exception e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
return null;
}
/**
* 看看里面是不是已经有session了
*/
Session session = (Session) threadLocalMap.get(flag).get();
/**
* 没有的话创建一个新的
*/
if (session == null || !session.isOpen()) {
SessionFactory sessionFactory = sessionFactoryMap.get(flag);
if (sessionFactory != null) {

session = sessionFactory.openSession();

}
/**
* 将session存入threadLocal
*/
t.set(session);
}
return session;
}


}

2 filter:HSessionFilter :在结束时关闭所有打开的hibernate session

package com.hf.hibernate.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.hf.hibernate.util.HSessionHolder;


public class HSessionFilter implements Filter {

private static final Log log = LogFactory .getLog(HSessionFilter.class);


public void init(FilterConfig config) throws ServletException {

}

/**
* 此过滤器只在最终关闭掉所有打开的session就可以了。
*/
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {

try {
chain.doFilter(request, response);
} finally {
HSessionHolder.closeSessions();
}
}

public void destroy() {}
}

使用方法:

例如在一个DAO的保存方法中:

/**
* 保存信息分类对象到数据库中,已经设置好了id了
* @return
*/
public static boolean save(Info category) {
log.info("开始进行保存分类信息操作");
/*获取到hibernate session,这里调用的是默认的数据库配置*/
Session session = HSessionHolder.getSession();
/*开启事务*/
Transaction tran = session.beginTransaction();
try {
session.save(category);
tran.commit();

} catch (Exception e) {

//这里应该增加回退功能
e.printStackTrace();
return false;
}
return true;
}

分享到:
评论

相关推荐

    Hibernate配置各种数据源详解

    Hibernate配置各种数据源 &lt;hibernate-configuration&gt; &lt;session-factory&gt; &lt;!– 各属性的配置–&gt; &lt;!—为true表示将Hibernate发送给数据库的sql显示出来 –&gt; ”show_sql”&gt;true &lt;!– SQL方言,这边设定的是MySQL ...

    Hibernate体系结构的概要图

    它充当数据存储源的代理,并负责创建Session对象。这里用到了工厂模式。需要注意的是SessionFactory并不是轻量级的,因为一般情况下,一个项目通常只需要一个SessionFactory就够,当需要操作多个数据库时,可以为每...

    hibernate4.3完整jar包

    Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。Hibernate的...

    hibernate3

    (2)SessionFactory:初始化Hibernate,充当数据存储源的代理,创建Session对象。一个SessinFactory实例对应一个数据存储源,应用从SessionFactory中获得Session实例。如果应用同时访问多个DB,怎需要为每个数据库...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     19.1.3 从容器中获得数据源  19.1.4 由Java应用本身提供数据库连接  19.2 配置事务类型  19.3 把SessionFactory与JNDI绑定  19.4 配置日志  19.5 使用XML格式的配置文件  19.6 小结  19.7 思考题 第20章 ...

    Spring+hibernate+quartz 定时操作数据库

    在spring+hibernate的框架中定时操作数据库,主要是拿到sessionFactory,不会出现no session 和transaction no-bound等问题,由sessionFactory完成对数据的操作,有些包是没有用的,有兴趣的可以自己删除掉

    第24次课-1 Spring与Hibernate的整合

    Spring配置管理SessionFactory与数据库的连接,在实际的应用中,数据源会采用依赖注入的方式,传递给SessionFactory。 见beans-config_sh.xml 24.3 Spring对Hibernate的简化 24.3.1 概述 Hibernate的持久层访问步骤...

    Hibernate+中文文档

    3.2. Hibernate数据源属性 3.3. Hibernate配置属性 3.4. Hibernate JDBC和连接(connection)属性 3.5. Hibernate缓存属性 3.6. Hibernate事务属性 3.7. 其他属性 3.8. Hibernate SQL方言 (hibernate.dialect) ...

    整合spring3-hibernate的小项目(一)

    博客文章 【SSH学习笔记】整合spring3-hibernate的小项目(一) ...1、使用spring注入dataSourse数据源 2、使用BaseDao获取注入SessionFactory并返回Session 3、实现查询所有和按字符串查询的方法 4、使用JUNIT测试

    HibernateAPI中文版.chm

    3.2. Hibernate数据源属性 3.3. Hibernate配置属性 3.4. Hibernate JDBC和连接(connection)属性 3.5. Hibernate缓存属性 3.6. Hibernate事务属性 3.7. 其他属性 3.8. Hibernate SQL方言 (hibernate.dialect) ...

    hibernate3.2中文文档(chm格式)

    3.2. Hibernate数据源属性 3.3. Hibernate配置属性 3.4. Hibernate JDBC和连接(connection)属性 3.5. Hibernate缓存属性 3.6. Hibernate事务属性 3.7. 其他属性 3.8. Hibernate SQL方言 (hibernate.dialect) ...

    Hibernate实战(第2版 中文高清版)

    第一部分 从Hibernate和EJB 3.0开始  第1章 理解对象/关系持久化   1.1 什么是持久化   1.1.1 关系数据库   1.1.2 理解SQL   1.1.3 在Java中使用SQL   1.1.4 面向对象应用程序中的持久化   1.2 范式不...

    hibernate精华教程

    (2)SessionFactory:初始化Hibernate,充当数据存储源的代理,创建Session对象。一个SessinFactory实例对应一个数据存储源,应用从SessionFactory中获得Session实例。如果应用同时访问多个DB,怎需要为每个数据库...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

     19.1.3 从容器中获得数据源  19.1.4 由Java应用本身提供数据库连接  19.2 配置事务类型  19.3 把SessionFactory与JNDI绑定  19.4 配置日志  19.5 使用XML格式的配置文件  19.6 小结  19.7 思考题 第20章 ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part3

     19.1.3 从容器中获得数据源  19.1.4 由Java应用本身提供数据库连接  19.2 配置事务类型  19.3 把SessionFactory与JNDI绑定  19.4 配置日志  19.5 使用XML格式的配置文件  19.6 小结  19.7 思考题 第20章 ...

    hibernate api

    Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。  ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part1.rar

     19.1.3 从容器中获得数据源  19.1.4 由Java应用本身提供数据库连接  19.2 配置事务类型  19.3 把SessionFactory与JNDI绑定  19.4 配置日志  19.5 使用XML格式的配置文件  19.6 小结  19.7 思考题 第20章 ...

    整合jsf hibernate spring实例

    部门人员一对多的CRUD操作 hibernate: 管理实体...spring:数据源配置与获得session IOC依赖注入 和 AOP 事务管理 jsf : backing bean的操作 jsf 标签应用 jsf 信息国际化以资源绑定 jsf 表单验证 jsf 导航设定

    Hibernate_3.2.0_符合Java习惯的关系数据库持久化

    3.2. Hibernate数据源属性 3.3. Hibernate配置属性 3.4. Hibernate JDBC和连接(connection)属性 3.5. Hibernate缓存属性 3.6. Hibernate事务属性 3.7. 其他属性 3.8. Hibernate SQL方言 (hibernate.dialect) ...

Global site tag (gtag.js) - Google Analytics