知识大全 利用ThreadLocal绑定Hibernate的session

Posted hr

篇首语:讨厌自己明明不甘平凡,却又不好好努力。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 利用ThreadLocal绑定Hibernate的session相关的知识,希望对你有一定的参考价值。

利用ThreadLocal绑定Hibernate的session  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  无论是立即加载还是延迟加载必须要连接数据库的 而在java中连接数据库是依赖java sql Connection 在hibernate中session就是Connection的一层高级封装 一个session对应了一个Connection 要实现延迟加载必须有session才行 而且要进行延迟加载还必须保证是同一个session才行 用另外一个session去延迟加载前一个session的代理对象是不行的 大家都知道Connection是使用过后必须要进行关闭的 那么我们如何保证一次请求过程中 一直都使用一个session呢 即一个Connection呢 而且还要保证请求结束后正确的关闭

  好 现在我们知道了我们要解决的问题

   如何保证请求结束后正确的关闭session

   如何保证请求过程中一直使用同一个session

  第一个问题很容易想到 使用过滤器

  view plaincopy to clipboardprint?    public void doFilter(ServletRequest request ServletResponse response

  FilterChain filterChain)

  try

  filterChain doFilter(request response);

   catch (IOException e)

  e printStackTrace();

   catch (ServletException e)

  e printStackTrace();

   finally

  try

  mitTransaction();

   catch (Exception e)

  HibernateUtil rollbackTransaction();

   finally

  HibernateUtil closeSession();

  

  

  

  public void doFilter(ServletRequest request ServletResponse response

  FilterChain filterChain)

  try

  filterChain doFilter(request response);

   catch (IOException e)

  e printStackTrace();

   catch (ServletException e)

  e printStackTrace();

   finally

  try

  mitTransaction();

   catch (Exception e)

  HibernateUtil rollbackTransaction();

   finally

  HibernateUtil closeSession();

  

  

  要解决第二个问题我们必须先搞清楚 请求在java中是以什么样的机制实现的 在java中一个请求就是一个线程 像流行的web容器Tomcat等 往往都是采用线程池机制的也就是说有n个线程在池子里面 每当有请求时 随机从线程池中取出一个线程对象去处理请求 实际上多次请求可能使用的是同一线程也可能不是 这是随机的 要保证整个请求中使用同一session最容易想到的就是把这个session绑定到线程上 在java中使用ThreadLocal可以轻松绑定变量 每个线程有一个自己的ThreadLocal 这个ThreadLocal会随线程的销毁一起销毁 既然是每个线程有一个那么多个线程间自然是不会有影响了 所以把session绑定在ThreadLocal里面是最好的选择了

  有关ThreadLocal的更多资料 大家可以百度或者参考

  

  

  最后我把相关的代码发出来

  view plaincopy to clipboardprint?    import java sql SQLException;

  import hibernate HibernateException;

  import hibernate Session;

  import hibernate SessionFactory;

  import hibernate Transaction;

  import hibernate cfg Configuration;

  import java sql Connection;

  import apache log j Logger;

  import java io File;

  /**

  *

  * <p>

  * Title:Hibernate工具

  * </p>

  *

  * <p>

  * 利用ThreadLocal 绑定 Hibernate 的session

  * </p>

  *

  * @author 孙钰佳

  * @mail

  * @version

  */

  public class HibernateUtil

  /**

  * Loger j的logger

  */

  private static final Logger logger = Logger getLogger(HibernateUtil class);

  /**

  * 存储hibernate session的ThreadLocal

  */

  private static final ThreadLocal sessionThread = new ThreadLocal();

  /**

  * 存储事务的ThreadLocal

  */

  private static final ThreadLocal transactionThread = new ThreadLocal();

  /**

  * Hibernate 的 Session工厂

  */

  private static SessionFactory sessionFactory = null;

  /**

  * 初始化SessionFactory

  *

  * @param file

  *            Hibernate配置文件

  */

  public static void initSessionFactory(File file)

  Configuration config = new Configuration();

  nfigure(file);

  sessionFactory = config buildSessionFactory();

  

  /**

  * 获取当前线程绑定的session

  *

  * @return Session

  * @throws HibernateException

  */

  public static Session getSession()

  Session s = (Session) sessionThread get();

  if (s == null)

  s = sessionFactory openSession();

  sessionThread set(s);

   else

  Connection conn = nnection();

  try

  if (conn == null || conn isClosed())

  try

  s close();

   catch (HibernateException e)

  logger warn( close session error: + e getMessage() e);

  

  s = sessionFactory openSession();

  sessionThread set(s);

  

   catch (SQLException e)

  throw new HibernateException(e);

  

  

  return s;

  

  /**

  * 取得当前session的事务

  *

  * @return Transaction

  */

  public static Transaction transaction()

  Transaction transaction = (Transaction) transactionThread get();

  if (transaction == null)

  transaction = getSession() beginTransaction();

  transactionThread set(transaction);

  

  return transaction;

  

  /**

  * 提交当前session的事务

  */

  public static void mitTransaction()

  Transaction transaction = (Transaction) transactionThread get();

  transactionThread set(null);

  if (transaction != null)

  mit();

  

  /**

  * 回滚当前session的事务

  */

  public static void rollbackTransaction()

  Transaction tx = (Transaction) transactionThread get();

  transactionThread set(null);

  if (tx != null)

  tx rollback();

  

  /**

  * 关闭当前线程使用的session

  */

  public static void closeSession()

  Session session = (Session) sessionThread get();

  if (session != null)

  session clear();

  session close();

  sessionThread set(null);

  

  

  

  import java sql SQLException;

  import hibernate HibernateException;

  import hibernate Session;

  import hibernate SessionFactory;

  import hibernate Transaction;

  import hibernate cfg Configuration;

  import java sql Connection;

  import apache log j Logger;

  import java io File;

  /**

  *

  * <p>

  * Title:Hibernate工具类

  * </p>

  *

  * <p>

  * 利用ThreadLocal 绑定 Hibernate 的session

  * </p>

  *

  * @author 孙钰佳

  * @mail

  * @version

  */

  public class HibernateUtil

  /**

  * Loger j的logger

  */

  private static final Logger logger = Logger getLogger(HibernateUtil class);

  /**

  * 存储hibernate session的ThreadLocal

  */

  private static final ThreadLocal sessionThread = new ThreadLocal();

  /**

  * 存储事务的ThreadLocal

  */

  private static final ThreadLocal transactionThread = new ThreadLocal();

  /**

  * Hibernate 的 Session工厂

  */

  private static SessionFactory sessionFactory = null;

  /**

  * 初始化SessionFactory

  *

  * @param file

  *            Hibernate配置文件

  */

  public static void initSessionFactory(File file)

  Configuration config = new Configuration();

  nfigure(file);

  sessionFactory = config buildSessionFactory();

  

  /**

  * 获取当前线程绑定的session

  *

  * @return Session

  * @throws HibernateException

  */

  public static Session getSession()

  Session s = (Session) sessionThread get();

  if (s == null)

  s = sessionFactory openSession();

  sessionThread set(s);

   else

  Connection conn = nnection();

  try

  if (conn == null || conn isClosed())

  try

  s close();

   catch (HibernateException e)

  logger warn( close session error: + e getMessage() e);

  

  s = sessionFactory openSession();

  sessionThread set(s);

  

   catch (SQLException e)

  throw new HibernateException(e);

  

  

  return s;

  

  /**

  * 取得当前session的事务

  *

  * @return Transaction

  */

  public static Transaction transaction()

  Transaction transaction = (Transaction) transactionThread get();

  if (transaction == null)

  transaction = getSession() beginTransaction();

  transactionThread set(transaction);

  

  return transaction;

  

  /**

  * 提交当前session的事务

  */

  public static void mitTransaction()

  Transaction transaction = (Transaction) transactionThread get();

  transactionThread set(null);

  if (transaction != null)

  mit();

  

  /**

  * 回滚当前session的事务

  */

  public static void rollbackTransaction()

  Transaction tx = (Transaction) transactionThread get();

  transactionThread set(null);

  if (tx != null)

  tx rollback();

  

  /**

  * 关闭当前线程使用的session

  */

  public static void closeSession()

  Session session = (Session) sessionThread get();

  if (session != null)

  session clear();

  session close();

  sessionThread set(null);

  

  

  

  下面是一个调用的例子: view plaincopy to clipboardprint?    public static void main(String[] args) throws Exception

  HibernateUtil initSessionFactory(new File(Test class getClassLoader()

   getResource( hibernate cfg xml ) getFile()));

  Session session = HibernateUtil getSession();

  HibernateUtil transaction();

  User u = new User();

  u setName( test );

  session save(u);

  mitTransaction();

  HibernateUtil closeSession();

cha138/Article/program/Java/ky/201311/28894

相关参考

知识大全 Hibernate的JNDI名称绑定分析

Hibernate的JNDI名称绑定分析  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Hibe

知识大全 深入ThreadLocal

Java线程:深入ThreadLocal  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Thre

知识大全 Java并发编程实践之ThreadLocal变量

Java并发编程实践之ThreadLocal变量  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 利用Myeclipse开发hibernate

利用Myeclipse开发hibernate  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!    

知识大全 利用Eclipse开发Hibernate应用程序

利用Eclipse开发Hibernate应用程序  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 利用HSQLDB进行Hibernate的单元测试二

利用HSQLDB进行Hibernate的单元测试二  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 

知识大全 利用HSQLDB进行Hibernate的单元测试一

利用HSQLDB进行Hibernate的单元测试一  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 

知识大全 Hibernate利用XDoclet自动生成配置文件

Hibernate利用XDoclet自动生成配置文件  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

知识大全 怎样利用Hibernate开发Blog实例分析

怎样利用Hibernate开发Blog实例分析  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  开

知识大全 hibernate.cfg.xml配置文件的说明

     在Eclipse中利用HibernateSynchronizer插件进行数据库表的映射数据查询和获取数据可以节省大量时间加速Hibernat