隨筆-42  評論-349  文章-4  trackbacks-0

          (原創(chuàng),殘夢追月轉(zhuǎn)載請注明!)    
          原來在我的csdn上,轉(zhuǎn)帖過來。

              使用jdbc連接數(shù)據(jù)庫所有功能都沒問題,發(fā)布到tomcat中也沒問題,可是如果使用tomcat的數(shù)據(jù)源,來連接數(shù)據(jù)庫,開始很正常,但是刷新幾次就會出現(xiàn)這個異常……

            

                   2008-04-26 22:35:40,812 WARN [org.hibernate.util.JDBCExceptionReporter] - SQL Error: 0, SQLState: null

           2008-04-26 22:35:40,812 ERROR [org.hibernate.util.JDBCExceptionReporter] - Cannot get a connection, pool error Timeout waiting for idle object

           2008-04-26 22:35:40,812 WARN [org.hibernate.util.JDBCExceptionReporter] - SQL Error: 0, SQLState: null

           2008-04-26 22:35:40,812 ERROR [org.hibernate.util.JDBCExceptionReporter] - Cannot get a connection, pool error Timeout waiting for idle object

           2008-04-26 22:35:40,812 ERROR [com.dao.MessageDAO] - find all failed

           org.springframework.jdbc.UncategorizedSQLException: Hibernate operation: Cannot open connection; uncategorized SQLException for SQL [???]; SQL state [null]; error code [0]; Cannot get a connection, pool error Timeout waiting for idle object; nested exception is org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot get a connection, pool error Timeout waiting for idle object

          Caused by:

          org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot get a connection, pool error Timeout waiting for idle object

              at org.apache.tomcat.dbcp.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:104)

              at org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.java:880) 

              at org.springframework.orm.hibernate3.LocalDataSourceConnectionProvider.getConnection(LocalDataSourceConnectionProvider.java:81)

          ……………………


          開始弄了半天也不知道怎么回事,后來發(fā)現(xiàn)是我自己寫的分頁代碼有問題……原來的代碼如下:


           1    /**
           2      * 自定義的,用屬性模糊查詢
           3      *
           4      * */
           5     public List find(String propertyName, Object value) {
           6 
           7         log.debug("finding Message instance with property: " + propertyName
           8 
           9               + ", value: " + value);
          10 
          11         try {
          12 
          13            String queryString = "from Message as model where model."
          14 
          15                                    + propertyName + " like "+value+" order by model.time desc";          
          16 
          17            return getHibernateTemplate().find(queryString);
          18 
          19         } catch (RuntimeException re) {
          20 
          21            log.error("find by property name failed", re);
          22 
          23            throw re;
          24 
          25         }
          26 
          27       }
          28 
          29 
          30     /**
          31      *
          32      * 自定義的方法,獲取指定頁的數(shù)據(jù)
          33      *
          34      * */
          35     public List gotoPage(int page,int pageSize){
          36 
          37        
          38 
          39         int totItem = this.findAll().size();//記錄總條數(shù)
          40 
          41         int pageNum = totItem / pageSize +1;//總頁數(shù)
          42 
          43         int begin = 0;//當(dāng)前起始記錄數(shù)
          44 
          45        
          46         begin=page*pageSize-pageSize+1//計算當(dāng)前起始位置
          47 
          48 
          49         Session s =this.getSession();
          50 
          51         String hql = "from Message message order by message.time desc";
          52 
          53         Query q =s.createQuery(hql);
          54 
          55         q.setFirstResult(begin);
          56 
          57         q.setMaxResults(pageSize);      
          58 
          59         return q.list();
          60 
          61     }

          在這句中:
                          Session s =this.getSession();

                  String hql = "from Message message order by message.time desc";

                  Query q =s.createQuery(hql);

             查詢數(shù)據(jù)時,Spring并不能夠自動管理連接,也就是說,在使用中這幾句代碼重視不段的獲取數(shù)據(jù)庫的連接,每調(diào)用一次就申請一個連接……直到 tomcat連接池中的連接耗盡……所以就再也申請不到連接了……出現(xiàn)了這個異常,解決辦法是使用事務(wù)來管理這段代碼,讓Spring自動管理這段代碼中申請的連接。我使用了Spring AOP自動事務(wù)代理……配置文件如下……


           1     <bean id="JndiDataSource"
           2         class="org.springframework.jndi.JndiObjectFactoryBean">
           3         <property name="jndiName">
           4             <value>java:comp/env/SqlServer</value>
           5         </property>
           6         <property name="resourceRef">
           7             <value>true</value>
           8         </property>
           9     </bean>
          10 
          11     <!-- hibernate的會話工廠 -->
          12     <bean id="sessionFactory"
          13         class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
          14         <property name="dataSource">
          15             <ref bean="JndiDataSource"></ref>
          16         </property>
          17         <property name="hibernateProperties">
          18             <props>
          19                 <prop key="hibernate.dialect">
          20                     org.hibernate.dialect.SQLServerDialect
          21                 </prop>
          22                 <!-- 顯示SQL,為了方便測試 -->
          23                 <prop key="hibernate.show_sql">true</prop>
          24             </props>
          25         </property>
          26         <property name="mappingResources">
          27             <list><!-- 映射文件 -->
          28                 <value>./Message.hbm.xml</value>
          29                 <value>./Setting.hbm.xml</value>
          30                 <value>./Admin.hbm.xml</value>
          31             </list>
          32         </property>
          33     </bean>
          34 
          35     <!-- 事務(wù)管理器 -->
          36     <bean id="transactionManger"
          37         class="org.springframework.orm.hibernate3.HibernateTransactionManager">
          38         <property name="sessionFactory">
          39             <ref bean="sessionFactory" />
          40         </property>
          41     </bean>
          42 
          43     <!--   配置事務(wù)攔截器-->
          44 
          45     <bean id="transactionInterceptor"
          46         class="org.springframework.transaction.interceptor.TransactionInterceptor">
          47         <property name="transactionManager">
          48             <ref bean="transactionManger" />
          49         </property>
          50         <!--   下面定義事務(wù)傳播屬性-->
          51         <property name="transactionAttributes">
          52             <props>
          53                 <prop key="find*">PROPAGATION_REQUIRED</prop>
          54                 <prop key="delete*">PROPAGATION_REQUIRED</prop>
          55                 <prop key="save*">PROPAGATION_REQUIRED</prop>
          56                 <prop key="merge*">PROPAGATION_REQUIRED</prop>
          57                 <prop key="attach*">PROPAGATION_REQUIRED</prop>           
          58                 <prop key="gotoPage">PROPAGATION_REQUIRED</prop>
          59             </props>
          60         </property>
          61     </bean>
          62 
          63     <!--  自動代理 -->
          64     <bean id="autoBeanNameProxyCreator"
          65         class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
          66         <property name="beanNames">
          67             <list>
          68                 <value>*DAO</value>            
          69                 <value>gotoPage</value>
          70                 <value>find</value>
          71             </list>
          72         </property>
          73         <property name="interceptorNames">
          74             <list>
          75                 <idref local="transactionInterceptor" />
          76             </list>
          77         </property>
          78         <!--  這里的配置是必須的,否則無法完成代理的類型轉(zhuǎn)化 這是使用CGLIB來生成代理 -->
          79         <property name="proxyTargetClass" value="true"/>
          80     </bean>
          81 
          82     <bean id="MessageDAO" class="com.dao.MessageDAO">
          83         <property name="sessionFactory">
          84             <ref bean="sessionFactory"></ref>
          85         </property>
          86     </bean>
          87 
          88     <bean id="SettingDAO" class="com.dao.SettingDAO">
          89         <property name="sessionFactory">
          90             <ref bean="sessionFactory"></ref>
          91         </property>
          92     </bean>
          93 
          94     <bean id="AdminDAO" class="com.dao.AdminDAO">
          95         <property name="sessionFactory">
          96             <ref bean="sessionFactory"></ref>
          97         </property>
          98     </bean>
          OK,問題成功解決!速度好像還快些!

          By:殘夢追月
          posted on 2008-07-15 17:57 殘夢追月 閱讀(10518) 評論(9)  編輯  收藏 所屬分類: SpringhibernateTomcat

          評論:
          # re: 在Spring+hibernate中不能釋放tomcat連接池中連接的解決辦法 2008-07-15 22:12 | Robin's Java World
          沒有說到點子上。
          真正的原因應(yīng)該是沒有commit,所以沒有正常釋放連接。  回復(fù)  更多評論
            
          # re: 在Spring+hibernate中不能釋放tomcat連接池中連接的解決辦法 2008-07-16 01:10 | YYX
          在hibernateDaoSupport的支持下,session不該這樣來獲得的。
          最好的方法是用execute()回調(diào),session會作為HibernateCallBack匿名內(nèi)部類的doInHibernate方法的傳入?yún)?shù)。

          你如果硬要用getSession(),那么請參考execute()方法源碼的寫法。  回復(fù)  更多評論
            
          # re: 在Spring+hibernate中不能釋放tomcat連接池中連接的解決辦法 2008-07-16 09:51 | 殘夢追月
          @YYX
          謝謝!請問如果用我這樣的方法的結(jié)果就是無法正常釋放連接嗎?用回調(diào)接口會自動釋放連接?  回復(fù)  更多評論
            
          # re: 在Spring+hibernate中不能釋放tomcat連接池中連接的解決辦法 2008-07-16 09:52 | 殘夢追月
          @Robin's Java World
          :-),謝謝,我說了半天也沒說出真正原因,只是把現(xiàn)象寫出來老!謝謝,您才是透過現(xiàn)象看本質(zhì)啊。  回復(fù)  更多評論
            
          # re: 在Spring+hibernate中不能釋放tomcat連接池中連接的解決辦法 2008-10-08 16:37 | 阿什頓
          我也出現(xiàn)這錯誤
          commit 什么意思?
          沒有使用事務(wù)操作的原因不?  回復(fù)  更多評論
            
          # re: 在Spring+hibernate中不能釋放tomcat連接池中連接的解決辦法 2008-10-15 22:13 | Bulejava
          復(fù)制你的事物管理代碼 還是沒用,刷新到10就掛了。  回復(fù)  更多評論
            
          # re: 在Spring+hibernate中不能釋放tomcat連接池中連接的解決辦法 2009-07-17 11:09 | 趙小明
          用了你的代碼,還是不管用  回復(fù)  更多評論
            
          # re: 在Spring+hibernate中不能釋放tomcat連接池中連接的解決辦法 2011-09-30 15:53 | showzh
          不管用  回復(fù)  更多評論
            
          # re: 在Spring+hibernate中不能釋放tomcat連接池中連接的解決辦法 2011-11-08 10:22 | 貝殼里的海
          學(xué)習(xí)了,今天剛好遇到這樣的問題,JBoss里的配置貌似也很重要  回復(fù)  更多評論
            
          主站蜘蛛池模板: 洮南市| 宜川县| 密云县| 平泉县| 万盛区| 盈江县| 丁青县| 眉山市| 连州市| 陆河县| 凤凰县| 仪征市| 哈尔滨市| 临汾市| 玉屏| 隆安县| 辽中县| 横峰县| 互助| 奎屯市| 黄梅县| 昌平区| 洪湖市| 新营市| 渑池县| 延长县| 山阴县| 平度市| 普定县| 鄯善县| 荥阳市| 凤冈县| 梓潼县| 兴业县| 赤水市| 平远县| 庐江县| 龙胜| 云南省| 大余县| 河东区|