期待更好更穩定的開源FrameWork的出現,讓我們一起努力吧!  
          日歷
          <2008年12月>
          30123456
          78910111213
          14151617181920
          21222324252627
          28293031123
          45678910
          統計
          • 隨筆 - 78
          • 文章 - 1
          • 評論 - 29
          • 引用 - 0

          導航

          常用鏈接

          留言簿(1)

          隨筆分類

          隨筆檔案(42)

          文章檔案(37)

          相冊

          搜索

          •  

          積分與排名

          • 積分 - 45282
          • 排名 - 1064

          最新隨筆

          最新評論

          閱讀排行榜

          評論排行榜

           

          說明:在解決問題的時候,參考了以下文章
          http://blog.csdn.net/wuqingyong/archive/2006/09/07/1187293.aspx
          http://jayenho.blog.51cto.com/37194/91556
          作為對問題的總結,特寫本文。


          最近總是遇到tomcat的log File報Connection reset的問題,使用的是JNDI的方式來使用DataSource。
          Apache Tomcat使用org.apache.naming.factory.DbcpDataSourceFactory作為默認的數據源工廠。


          Tomcat的DBCP使用Apache的ObjectPool作為Connection Pool的實現,在構造GenericObjectPool的時候,會生成一個Inner Class Evictor,實現Runnable的接口。如果屬性_timeBetweenEvictionRunsMillis > 0,每過_timeBetweenEvictionRunsMillis毫秒后Evictor會調用evict method,檢查Object的idle time是否大于屬性_minEvictableIdleTimeMillis毫秒(如果_minEvictableIdleTimeMillis設置為<=0則忽略,使用default value 30分鐘),如果是則銷毀該Object,否則就激活并進行Validate,然后調用ensureMinIdle method檢查確保Connection Pool中的Object個數不小于屬性_minIdle。在調用returnObject method把Object放回ObjectPool時候,需要檢查該Object是否有效,然后調用PoolableObjectFactory的passivateObject method使Object處于inactive狀態,再檢查ObjectPool中的對象個數是否小于屬性_maxIdle,是則可以把該Object放回到ObjectPool,否則銷毀此Object。
           
          除此之外,還有幾個比較重要的屬性,_testOnBorrow,_testOnReturn,_testWhileIdle,這些屬性的意思是取得,返回對象,空閑時候是否進行Valiadte,檢查對象是否有效。默認都為False,只有把這些屬性設為True,再提供_validationQuery語句就可以保證DBCP始終有效了,例如,Oracle中就完全可以使用select 1 from dual來進行驗證,這里要注意的是,DBCP要求_validationQuery語句查詢的Result Set必須為非空。
           
          在Tomcat的Server.xml,我們可以看看下面的這個例子:
           
          <Resource name="lda/raw"
                        type="javax.sql.DataSource"
                         password="lda_master"
                         driverClassName="oracle.jdbc.driver.OracleDriver"
                         maxIdle="30" minIdle="2" maxWait="60000" maxActive="1000"
                         testOnBorrow="true" testWhileIdle="true" validationQuery="select 1 from dual"
                         username="lda_master" url="jdbc:oracle:thin:@192.160.100.107:15537:lcststd"/>
           這樣的話,就可以避免產生Connection Reset的錯誤了.
          這樣一來,就能夠解決Connect Reset的問題了。剛才說了,其實很多App Server都會有相應的配置地方,只是大型的服務器正好提供了Admin Console,上面可以顯式的配置Connection Pool,也有明顯的屬性選擇,這里就不一一詳述了,都是眼見的功夫。


          posted on 2008-12-23 10:19 BlueSky_itwangxinli 閱讀(4538) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
           
          Copyright © BlueSky_itwangxinli Powered by: 博客園 模板提供:滬江博客
          主站蜘蛛池模板: 浠水县| 长葛市| 乐业县| 沧州市| 台东县| 北票市| 射洪县| 手游| 股票| 隆昌县| 民权县| 东港市| 茌平县| 肥西县| 甘南县| 城固县| 邮箱| 岑巩县| 博野县| 泸西县| 定远县| 资中县| 明星| 荆州市| 昔阳县| 江达县| 克拉玛依市| 古蔺县| 黄浦区| 南岸区| 安康市| 迭部县| 墨江| 西贡区| 大关县| 察隅县| 通山县| 高青县| 大名县| 陇南市| 东兴市|