新闻正文

Hibernate 使用外部 Connection 的问题

来源:JAVA天堂  JAVA学习者  2007-5-2 02:16:51 网友评论 0 条 字体:[ ] ~我要投稿!

  最近在一个项目中试用了 Hibernate . 因为项目分两部分来做,在另一个部分中,已经使用了一个连接池(自行开发的).现在两部分要合在一起,于是便出现了如下问题.
  开始,我们决定使用Hibernate的外部连接方法进行数据访问:
  
  java代码:
  1
  2 public static DbSession openSession() {...}
  3   DbSession dbSession = null;
  4   try {...}
  5    //System.out.println("session is start");
  6    ConnectionPool connectionPool = PooledConnectionFactory.getConnectionPool();
  7    Connection con = connectionPool.getConnection();
  8
  9    Session s = (Session) session.get();
  10    if (s == null) {...}
  11     s = fact.openSession(con);//在此,使用外部连接池所给的连接
  12     session.set(s);
  13    }
  14
  15    dbSession = new DbSession(s);
  16   } catch (Throwable t) {
  17    String msg = "couldn"t open a hibernate session for SessionFactory "" + """;
  18    log.error( msg, t );

  19    throw new DbException( msg + " : " + t.getMessage() );
  20   }
  21   return dbSession;
  22  }
  23
  
  关闭Session方法如下:
  java代码:
  
  1
  2 public static void closeSession() throws HibernateException,Exception{...}
  3     Session s = (Session) session.get();
  4     session.set(null);
  5     if (s != null){...}
  6       s.connection().close();
  7       s.close();
  8       System.out.println("session closing");
  9       //s = null;
  10
  11     }
  12   }
  13
  
  问题出现了.在我们很慢点击的访问下还好.只要稍刷的快些,便会出现 Can"t excute Query 的错误.大概时在执行某一查询时, Session中的Connection为close.或 session 为空.很奇怪,也许是这种方法在快速并发访问时,会出现这个问题.其实在Session.close()的时候,Session是不会为空的..所以在此有些不理解.怎么会取到已经关闭的连接呢.不知道大家有没有遇到过.
  
  现在,我们有两种解决办法.

  一是,将前一部分的连接池注册为DataSource,这样由Hibernate调用.
  二是,将前一部分的连接池改为Hibernate所带的DBCP等.
  这两种方法都不难更改.
  不过,只是不理解上述的BUG.所以和大家讨论一下.也希望 Robbin 能看到.解释一下.
  


收藏到ViVi   收藏此页到365Key
上一篇:如何用 Hibernate 实现分页查询
下一篇:Hibernate 的简单 Read 性能测试
用户名:新注册) 密码: 匿名评论 [所有评论]
评论内容:不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
本栏搜索
  • Google
   网站首页 -  网站地图 -  技术学习 -  网站投稿 -  帮助中心
Copyright 2003-2008 www.javah.net All Rights Reserved
2008 如果你喜欢本站 请收藏本站 并推荐给你的朋友一起分享