首页 | IT新闻 | 硬件 | 操作系统 | 开发 | 网络编程 | 数据库 | 热门框架 | 网络安全 | 组网 | 建站指南 | 网页制作 | 特效 | 实用技巧 | 服务器 | 办公 | QQ | 探索 | 社区

  • 技术部落
  • 部落首页 > 热门框架 > Hibernate开源框架 > 正文
  • 关于Hibernate使用外部Connection的问题
      2007-11-5  来源:CSDN  编辑:Jsbulo  热度:

      最近在一个项目中试用了 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 能看到.解释一下.