志當存高遠,功到自然成!

          少年強則中國強,少年進步則中國進步!

          BlogJava 首頁 新隨筆 聯(lián)系 聚合 管理
            53 Posts :: 2 Stories :: 2 Comments :: 0 Trackbacks

           

          前幾天用spring+hibernate+struts寫了個增/刪/改/查的例子。調(diào)試期間問題就來了,當查詢結(jié)果翻頁好幾次就沒N久沒有響應了。最后控制報錯。網(wǎng)上查了,它說數(shù)據(jù)庫連接(池)問題。

          出現(xiàn)錯誤如下:

          [2007-9-30 下午12時03分03秒 CST] [Error] [WebLogicServer] [BEA-000337] [ExecuteThread: '13' for queue: 'weblogic.kernel.Default' has been busy for "901" seconds working on the request "Http Request: /admin/school.do", which is more than the configured time (StuckThreadMaxTime) of "600" seconds.]

          <轉(zhuǎn)為[,>轉(zhuǎn)為],才發(fā)得出以上面錯誤。可能是javaeye的bug。 

          先說下我配置

          1.環(huán)境:

          spring 2.0.6,hibernate 3.2.3,struts 1.2.9,oracle 10.2,weblogic 8.1.4

          jdbc是ojdbc14.jar

          2.連接池用DBCP

          xml 代碼
          1. <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">  
          2.     <property name="driverClassName" value="${jdbc.driverClassName}"/>  
          3.     <property name="url" value="${jdbc.url}"/>  
          4.     <property name="username" value="${jdbc.username}"/>  
          5.     <property name="password" value="${jdbc.password}"/>  
          6. bean>  

           3.分頁方法(參考springside的),此類繼承HibernateDaoSupport

          java 代碼
          1. public Page listByPage(Class entityClass, int pageNo, int pageSize, List criterions, List orders) {   
          2.     Criteria criteria = createCriteria(entityClass, criterions);   
          3.     CriteriaImpl impl = (CriteriaImpl) criteria;   
          4.   
          5.     // 先把Projection和OrderBy條件取出來,清空兩者來執(zhí)行Count操作   
          6.     Projection projection = impl.getProjection();   
          7.     //獲取總記錄數(shù)   
          8.     int totalCount = ((Integer) criteria.setProjection(Projections.rowCount()).uniqueResult()).intValue();   
          9.   
          10.        
          11.     if(totalCount < 1) {   
          12.         return new Page();   
          13.     }   
          14.        
          15.     //加排序   
          16.     if(orders != null) {   
          17.         for(int i=0; i
          18.             criteria.addOrder((Order) orders.get(i));   
          19.         }   
          20.     }   
          21.     //原來的投影   
          22.     criteria.setProjection(projection);   
          23.     int startIndex = Page.getStartOfPage(pageNo, pageSize);   
          24.     //取得結(jié)果   
          25.     List list = criteria.setFirstResult(startIndex).setMaxResults(pageSize).list();   
          26.        
          27.     return new Page(startIndex, totalCount, pageSize, list);   
          28. }   
          29.   
          30. public Criteria createCriteria(Class entityClass, List criterions) {   
          31.     Criteria criteria = getSession().createCriteria(entityClass);   
          32.     if(criterions != null) {   
          33.         for(int i=0; i
          34.             criteria.add((Criterion) criterions.get(i));   
          35.         }   
          36.     }   
          37.        
          38.     return criteria;   
          39. }  

          另外,沒有用OpenSessionInViewFilter,struts與spring的整合:DelegatingRequestProcessor、action path與bean name同名。

          翻頁不過10次,服務器就沒響應了,最后出現(xiàn)上面的錯誤的了。



          問題解決,問題的原因是數(shù)據(jù)庫連接耗盡,我用HiberanteDaoSupport的getSession()方法取得Session后沒有釋放Session。

          出問題的代碼處:

          java 代碼
          1. public Criteria createCriteria(Class entityClass, List criterions) {       
          2.     Criteria criteria = getSession().createCriteria(entityClass);       
          3.     if(criterions != null) {       
          4.         for(int i=0; i    
          5.             criteria.add((Criterion) criterions.get(i));       
          6.         }       
          7.     }       
          8.            
          9.     return criteria;       
          10. }  

           

          用完Session釋放后就沒事了,調(diào)用HiberanteDaoSupport的releaseSession(session);方法后即可解決。

          現(xiàn)在正確的代碼:

          java 代碼
          1. public Page listByPage(Class entityClass, int pageNo, int pageSize, List criterions, List orders) {   
          2.     Session session = getSession();   
          3.     //創(chuàng)建criteria   
          4.     Criteria criteria = session.createCriteria(entityClass);   
          5.     //為criteria添加criterions   
          6.     createCriteria(entityClass, criteria, criterions);   
          7.     CriteriaImpl impl = (CriteriaImpl) criteria;   
          8.   
          9.     // 先把Projection和OrderBy條件取出來,清空兩者來執(zhí)行Count操作   
          10.     Projection projection = impl.getProjection();   
          11.     //獲取總記錄數(shù)   
          12.     int totalCount = ((Integer) criteria.setProjection(Projections.rowCount()).uniqueResult()).intValue();   
          13.   
          14.        
          15.     if(totalCount < 1) {   
          16.         return new Page();   
          17.     }   
          18.        
          19.     //加排序   
          20.     if(orders != null) {   
          21.         for(int i=0; i<orders.size(); i++) {   
          22.             criteria.addOrder((Order) orders.get(i));   
          23.         }   
          24.     }   
          25.     //原來的投影   
          26.     criteria.setProjection(projection);   
          27.     int startIndex = Page.getStartOfPage(pageNo, pageSize);   
          28.     //取得結(jié)果   
          29.     List list = criteria.setFirstResult(startIndex).setMaxResults(pageSize).list();   
          30.     //釋放hiberante資源,一定要釋放,要不然就數(shù)據(jù)庫連接耗盡.   
          31.     releaseSession(session);   
          32.     return new Page(startIndex, totalCount, pageSize, list);   
          33. }   
          34.   
          35. public Criteria createCriteria(Class entityClass, Criteria criteria, List criterions) {   
          36.     if(criterions != null) {   
          37.         for(int i=0; i<criterions.size(); i++) {   
          38.             criteria.add((Criterion) criterions.get(i));   
          39.         }   
          40.     }   
          41.        
          42.     return criteria;   
          43. }  
          主站蜘蛛池模板: 彰化县| 衡南县| 建瓯市| 惠东县| 普格县| 关岭| 咸宁市| 泰州市| 库尔勒市| 泽库县| 米林县| 修文县| 云阳县| 唐河县| 隆化县| 孙吴县| 嘉义市| 尼玛县| 乐亭县| 牡丹江市| 五指山市| 阳西县| 开封市| 定边县| 昌邑市| 蒲城县| 通榆县| 阿勒泰市| 清涧县| 土默特左旗| 眉山市| 社会| 徐汇区| 上蔡县| 清涧县| 通道| 侯马市| 乌兰察布市| 鲁山县| 淅川县| 兴山县|