<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    ivaneeo's blog

    自由的力量,自由的生活。

      BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
      669 Posts :: 0 Stories :: 64 Comments :: 0 Trackbacks
    我們大家在做J2EE項目開發的時候,都會用到Application Server,然后配置Connection Pool,Data Source,但不知道大家有沒有留意到,其實我們絕大部分的應用用的都是Apache的DBCP機制。
     
    JES,Weblogic,JBoss等等的大型App Server,其中一個好處就是提供了Admin Console,讓配置做起來就像傻瓜式的,Step By Step就可以了,下面舉個用Tomcat的應用例子,深入一點探討DBCP的配置都做了些什么。(當然得配置Server.xml了,但是其實JES和Weblogic等等的大型App Server,也是可以同樣修改Server.xml或這Domain.xml來達到同一目的的,只不過有了Admin Console,大家容易避免犯錯,但其實我覺得,要深入了解一個App Server,避免不了深入了解配置文件里面的內容)。
     
    當使用DBCP(通常我們都是用Oracle的了)時候,不知道大家有沒有遇到一個情況,當數據庫連接因為某種原因斷掉(有可能時網絡問題,導致App Server跑了一天后,第二天再跑馬上爆錯誤),再從Connection Pool中獲取連接而又不做Validate,這時候取得的Connection實際上已經是無效的了,從而導致程序一跑,馬上爆Connect Reset錯誤。
     
    其實只要你了解一下DBCP的運作機制和相關屬性的話,這個問題就很容易避免了。
     
    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"/>
     
    這樣一來,就能夠解決Connect Reset的問題了。剛才說了,其實很多App Server都會有相應的配置地方,只是大型的服務器正好提供了Admin Console,上面可以顯式的配置Connection Pool,也有明顯的屬性選擇,這里就不一一詳述了,都是眼見的功夫。

    本文出自 “jayenho” 博客,轉載請與作者聯系!

    posted on 2011-01-29 11:30 ivaneeo 閱讀(412) 評論(0)  編輯  收藏 所屬分類: java魔力
    主站蜘蛛池模板: 亚洲日本VA中文字幕久久道具| 手机在线免费视频| 日韩国产精品亚洲а∨天堂免| 亚洲gv白嫩小受在线观看| 国产免费一区二区三区VR| 免费下载成人电影| 久久久久久久99精品免费| 日韩在线视频播放免费视频完整版| 亚洲一区在线观看视频| 亚洲免费在线视频| 国产亚洲日韩在线三区| 免费播放春色aⅴ视频| 在线观看永久免费视频网站| 美女视频黄的全免费视频网站| 无码人妻一区二区三区免费看| 色爽黄1000部免费软件下载| 久久亚洲精品无码av| 在线观看亚洲AV日韩A∨| 亚洲一区在线观看视频| 亚洲午夜久久久久久尤物| 亚洲一区精品中文字幕| 无码欧精品亚洲日韩一区| 亚洲日韩精品一区二区三区| 亚洲中文无韩国r级电影| 亚洲?V无码乱码国产精品| 免费二级毛片免费完整视频| 午夜国产大片免费观看| 免费在线视频一区| 亚洲国产免费综合| 亚洲情a成黄在线观看| 亚洲国产一成久久精品国产成人综合| 国产午夜免费福利红片| 国产一精品一aⅴ一免费| 免费观看四虎精品国产永久| 亚洲av再在线观看| 久久亚洲中文字幕精品一区| 激情综合色五月丁香六月亚洲| 亚洲老妈激情一区二区三区| 亚洲精品乱码久久久久久蜜桃不卡| 国产亚洲精品a在线无码| 亚洲AV日韩精品久久久久久|