最近在一个项目中试用了 Hibernate 因为项目分两部分来做在另一个部分中已经使用了一个连接池(自行开发的)现在两部分要合在一起于是便出现了如下问题
开始我们决定使用Hibernate的外部连接方法进行数据访问:
java代码:
public static DbSession openSession() {}
DbSession dbSession = null;
try {}
//Systemoutprintln(session is start);
ConnectionPool connectionPool = PooledConnectionFactorygetConnectionPool();
Connection con = connectionPoolgetConnection();
Session s = (Session) sessionget();
if (s == null) {}
s = factopenSession(con);//在此使用外部连接池所给的连接
sessionset(s);
}
dbSession = new DbSession(s);
}catch (Throwable t) {
String msg = couldnt open a hibernate session for SessionFactory + ;
logerror( msg t );
throw new DbException( msg + : + tgetMessage() );
}
return dbSession;
}
关闭Session方法如下:
java代码:
public static void closeSession() throws HibernateExceptionException{}
Session s = (Session) sessionget();
sessionset(null);
if (s != null){}
nnection()close();
sclose();
Systemoutprintln(session closing);
//s = null;
}
}
问题出现了在我们很慢点击的访问下还好只要稍刷的快些便会出现 Cant excute Query 的错误大概时在执行某一查询时 Session中的Connection为close或 session 为空很奇怪也许是这种方法在快速并发访问时会出现这个问题其实在Sessionclose()的时候Session是不会为空的所以在此有些不理解怎么会取到已经关闭的连接呢不知道大家有没有遇到过
现在我们有两种解决办法
一是将前一部分的连接池注册为DataSource这样由Hibernate调用
二是将前一部分的连接池改为Hibernate所带的DBCP等
这两种方法都不难更改
不过只是不理解上述的BUG所以和大家讨论一下也希望 Robbin 能看到解释一下