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