当前位置导航:炫浪网>>网络学院>>编程开发>>JAVA教程>>Java进阶

Hibernate 使用外部 Connection 的问题


  最近在一个项目中试用了 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 能看到.解释一下.
相关内容
赞助商链接