最近在一個項目中試用了 Hibernate
因為項目分兩部分來做
在另一個部分中
已經使用了一個連接池(自行開發的)
現在兩部分要合在一起
於是便出現了如下問題
開始
我們決定使用Hibernate的外部連接方法進行數據訪問:
java代碼: public static DbSession openSession() {
}
DbSession dbSession = null;
try {
}
//System
out
println(
session is start
);
ConnectionPool connectionPool = PooledConnectionFactory
getConnectionPool();
Connection con = connectionPool
getConnection();
Session s = (Session) session
get();
if (s == null) {
}
s = fact
openSession(con);//在此
使用外部連接池所給的連接
session
set(s);
}
dbSession = new DbSession(s);
} catch (Throwable t) {
String msg =
couldn
t open a hibernate session for SessionFactory
+
;
log
error( msg
t );
throw new DbException( msg +
:
+ t
getMessage() );
}
return dbSession;
}
關閉Session方法如下: java代碼:
public static void closeSession() throws HibernateException
Exception{
}
Session s = (Session) session
get();
session
set(null);
if (s != null){
}
nnection()
close();
s
close();
System
out
println(
session closing
);
//s = null;
}
}
問題出現了
在我們很慢點擊的訪問下還好
只要稍刷的快些
便會出現 Can
t excute Query 的錯誤
大概時在執行某一查詢時
Session中的Connection為close
或 session 為空
很奇怪
也許是這種方法在快速並發訪問時
會出現這個問題
其實在Session
close()的時候
Session是不會為空的
所以在此有些不理解
怎麼會取到已經關閉的連接呢
不知道大家有沒有遇到過
現在我們有兩種解決辦法 一是
將前一部分的連接池注冊為DataSource
這樣由Hibernate調用
二是
將前一部分的連接池改為Hibernate所帶的DBCP等
這兩種方法都不難更改
不過
只是不理解上述的BUG
所以和大家討論一下
也希望 Robbin 能看到
解釋一下
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28862.html