最近在一个项目中试用了 Hibernate . 因为项目分两部分来做,在另一个部分中,已经使用了一个连接池(自行开发的).现在两部分要合在一起,于是便出现了如下问题.
开始,我们决定使用Hibernate的外部连接方法进行数据访问:
关闭Session方法如下:
问题出现了.在我们很慢点击的访问下还好.只要稍刷的快些,便会出现 Can't excute Query 的错误.大概时在执行某一查询时, Session中的Connection为close.或 session 为空.很奇怪,也许是这种方法在快速并发访问时,会出现这个问题.其实在Session.close()的时候,Session是不会为空的..所以在此有些不理解.怎么会取到已经关闭的连接呢.不知道大家有没有遇到过.
现在,我们有两种解决办法.
一是,将前一部分的连接池注册为DataSource,这样由Hibernate调用.
二是,将前一部分的连接池改为Hibernate所带的DBCP等.
这两种方法都不难更改.
不过,只是不理解上述的BUG.所以和大家讨论一下.也希望 Robbin 能看到.解释一下.
开始,我们决定使用Hibernate的外部连接方法进行数据访问:
| java代码: |
|
1 ...}
3 DbSession dbSession = null; ...}
5 //System.out.println("session is start"); 6 ConnectionPool connectionPool = PooledConnectionFactory.getConnectionPool(); 7 Connection con = connectionPool.getConnection(); 8 9 Session s = (Session) session.get(); ...}
11 s = fact.openSession(con);//在此,使用外部连接池所给的连接 14 12 session.set(s); 13 } 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 ...}
3 Session s = (Session) session.get(); 13 4 session.set(null); ...}
6 s.connection().close(); 12 }7 s.close(); 8 System.out.println("session closing"); 9 //s = null; 10 11 } |
问题出现了.在我们很慢点击的访问下还好.只要稍刷的快些,便会出现 Can't excute Query 的错误.大概时在执行某一查询时, Session中的Connection为close.或 session 为空.很奇怪,也许是这种方法在快速并发访问时,会出现这个问题.其实在Session.close()的时候,Session是不会为空的..所以在此有些不理解.怎么会取到已经关闭的连接呢.不知道大家有没有遇到过.
现在,我们有两种解决办法.
一是,将前一部分的连接池注册为DataSource,这样由Hibernate调用.
二是,将前一部分的连接池改为Hibernate所带的DBCP等.
这两种方法都不难更改.
不过,只是不理解上述的BUG.所以和大家讨论一下.也希望 Robbin 能看到.解释一下.

博主在项目中试用Hibernate,两部分项目合并后使用外部连接方法访问数据。慢点击访问正常,快速并发访问时出现Can't excute Query错误,可能是Session中Connection关闭或session为空。提出两种解决办法,同时希望探讨该问题。

被折叠的 条评论
为什么被折叠?



