解決Hibernate session is closed的一種可行性方案
初學Hibernate的一般都會碰到這個問題,呵呵
下面是查詢程式碼示例。
public Vector<Vector<Object>> handleQuery(String hql, Vector<Object> value) {
if(hql == null || hql.equals("")) {
return null;
}
Vector<Vector<Object>> res = new Vector<Vector<Object>>();
Session session = WorkDao.openSession();
Iterator<Work> it = null;
Query query = null;
if(value == null || value.size() == 0) {
it = session.createQuery(hql).iterate();
}
else {
query = session.createQuery(hql);
if(query == null) {
return null;
}
int vs = value.size();
for(int i = 0; i < vs; i++) {
Object vi = value.elementAt(i);
query.setParameter(i, vi);
}
it = query.iterate();
}
if(it == null) {
return null;
}
while(it.hasNext()) {
Work work = it.next();
Vector<Object> row = new Vector<Object>();
row.add(work.getId());
row.add(work.getTaskID());
row.add(work.getTaskType());
row.add(work.getCreateDate());
row.add(work.getTaskCon());
row.add(work.getCompleteStatus());
row.add(work.getCompleteDate());
row.add(work.getTaskRemark());
res.add(row);
}
WorkDao.closeSession();
if(res == null || res.size() == 0) {
return null;
}
return res;
}
在這段程式碼中,呼叫了
Session session = WorkDao.openSession();
和
WorkDao.closeSession();
許多人認為一旦呼叫了close(),一個Session就徹底玩完去見馬克思了,錯誤就在這裡發生了,因為呼叫close後Session還是存在的,只是狀態是close,而sessionFactory在檢測到有Session存在時,是將現有session作為引數返回的。
以下為避免此問題的一種解決方案,注意,只是一種,這種方法認為一件事做完了,Session理所當然的要見馬克思
開啟Session,注意這裡並不一定是一個全新的Session
private static Session openSession() {
if(WorkDao.session == null) {
WorkDao.session = WorkDao.sessionFactory.openSession();
}
return WorkDao.session;
}
我們重寫過的close與open方法配合,保證每次都是一個全新的session
private static void closeSession() {
if(WorkDao.session != null) {
WorkDao.session.close();
WorkDao.session = null;
}
}
相關文章
- 解決SpringMVC+Hibernate錯誤: No Hibernate Session bound to threadSpringMVCSessionthread
- Hibernate綜合查詢解決方案 (轉)
- hibernate open session in view 丟擲異常解決方法SessionView
- 一種Django多租戶解決方案Django
- 一種方便的跨域開發解決方案跨域
- 解決okhttp報java.lang.IllegalStateException: closed,java.lang.IllegalStateException: closedHTTPJavaException
- WEB網站國際化的一種解決方案Web網站
- 一種更優雅的Flutter Dialog解決方案Flutter
- 一種巢狀滑動衝突的解決方案巢狀
- RxJava記憶體洩漏的一種解決方案RxJava記憶體
- 字首索引,一種優化索引大小的解決方案索引優化
- 跨域的幾種解決方案跨域
- 一種非巢狀滑動衝突的解決方案巢狀
- 生成分散式唯一ID的幾種解決方案分散式
- go grpc: connection reset by peer 的一種解決方案GoRPC
- Asp.Net處理Session失效解決方案ASP.NETSession
- 一種 Laravel 異常上下文解決方案Laravel
- 爬蟲受限的三種解決方案爬蟲
- 高精度定位的幾種解決方案
- js 非同步的幾種解決方案JS非同步
- 利用memcached配置session一致性另外一種方案Session
- 如何管理hibernate 的session?Session
- Hibernate的session問題Session
- org.hibernate.exception.SQLGrammarException: could not extract ResultSet解決方案ExceptionSQL
- hibernate的事務管理和session物件的詳解Session物件
- 微信小遊戲程式碼包侵權的一種解決方案遊戲
- 一種處理laravel返回值響應的解決方案Laravel
- 網頁佈局自適應的另一種解決方案網頁
- 在typescript專案中解決cycle依賴的一種方案TypeScript
- client backup was not attempted because backup window closed 錯誤解決一例client
- 當laravel獲取不到session的三種解決辦法LaravelSession
- hibernate中建立session的兩種方式方式,區別在哪裡?Session
- 為x-windows自定義一種session管理方案(轉)WindowsSession
- 網咖解決方案---100種
- python程式碼錯誤RuntimeError: Session is closedPythonErrorSession
- linux系統下hyperf 熱更新的另一種解決方案Linux
- 一種中文數字轉阿拉伯數字的解決方案
- 一種OBS在macos下找不到usb話筒的解決方案Mac