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

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

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

    tinguo002

     

    java.net.SocketException: Connection reset 解決方法

    推薦好文:http://www.cnblogs.com/zmc/p/3295761.html

    當(dāng)數(shù)據(jù)庫(kù)連接池中的連接被創(chuàng)建而長(zhǎng)時(shí)間不使用的情況下,該連接會(huì)自動(dòng)回收并失效,但客戶端并不知道,在進(jìn)行數(shù)據(jù)庫(kù)操作時(shí)仍然使用的是無(wú)效的數(shù)據(jù)庫(kù)連接,這樣,就導(dǎo)致客戶端程序報(bào)“ java.sql.SQLException: Io 異常: Connection reset” 或“java.sql.SQLException 關(guān)閉的連接”異常。


    解決辦法:客戶端在使用一個(gè)無(wú)效的連接時(shí)會(huì)先對(duì)該連接進(jìn)行測(cè)試,如果發(fā)現(xiàn)該連接已經(jīng)無(wú)效,則重新從連接池獲取有效數(shù)據(jù)庫(kù)連接來(lái)使用。

    在tomcat的context.xml里面設(shè)置數(shù)據(jù)源時(shí)候可參考:

     <Resource auth="Container"
      driverClassName="oracle.jdbc.OracleDriver"
      type="javax.sql.DataSource"
      url="jdbc:oracle:thin:@11.11.11.45:1521:orcl"
      name="jdbc/login"
      username="login"
      password="login"
      maxActive="15"
      maxIdle="10"
      maxWait="-1"
      minIdle="2"
      removeAbandonedTimeout="5"
      testOnBorrow="true"
      testWhileIdle="true"
      testOnReturn="true"
      removeAbandoned="true"
      logAbandoned="true"
      validationQuery="select 1 from dual"
     /> 
     
     
    參考:http://www.cnblogs.com/younes/archive/2012/06/01/2529483.html




    DBCP數(shù)據(jù)庫(kù)連接失效的解決方法(Io 異常:Connection reset)


    網(wǎng)上很多評(píng)論說(shuō)DBCP有很多BUG,但是都沒(méi)有指明是什么BUG,只有一部分人說(shuō)數(shù)據(jù)庫(kù)如果因?yàn)槟撤N原因斷掉后再DBCP取道的連接都是失效的連接,而沒(méi)有重新取。有的時(shí)候會(huì)報(bào)Io 異常:Connection reset。

    解決方法:

    spring中datasource的配置如下:
        <bean id="dispatchdataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
        <property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:myserver" />
        <property name="username" value="user1" />
        <property name="password" value="pwd" />
        <property name="maxActive" value="10000" />
        <property name="maxIdle" value="30" />
         <property name="minIdle" value="2" />
        <property name="maxWait" value="600000" />
        <property name="testOnBorrow" value="true"/>
        <property name="testWhileIdle" value="true"/>
        <property name="validationQuery" value="select 1 from dual"/>
    </bean>

     

    分析:

    DBCP使用apache的對(duì)象池ObjectPool作為連接池的實(shí)現(xiàn),有以下主要的方法

    Object borrowObject() throws Exception;從對(duì)象池取得一個(gè)有效對(duì)象

    void returnObject(Object obj) throws Exception;使用完的對(duì)象放回對(duì)象池

    void invalidateObject(Object obj) throws Exception;使對(duì)象失效

    void addObject() throws Exception;生成一個(gè)新對(duì)象


    ObjectPool的一個(gè)實(shí)現(xiàn)就是GenericObjectPool,這個(gè)類使用對(duì)象工廠PoolableObjectFactory實(shí)現(xiàn)對(duì)象的生成,失效檢查等等功能,以其實(shí)現(xiàn)數(shù)據(jù)庫(kù)連接工廠PoolableConnectionFactory做以說(shuō)明,主要方法:

         Object makeObject() throws Exception; 使用ConnectionFactory生成新連接

         void destroyObject(Object obj) throws Exception;關(guān)閉連接

         boolean validateObject(Object obj); 驗(yàn)證連接是否有效,如果_validationQuery不空,則使用該屬性作為驗(yàn)證連接是否有效的sql語(yǔ)句,查詢數(shù)據(jù)庫(kù)

         void activateObject(Object obj) throws Exception;激活連接對(duì)象

         void passivateObject(Object obj) throws Exception; 關(guān)閉連接生成過(guò)的Statement和ResultSet,使連接處于非活動(dòng)狀態(tài)

        而GenericObjectPool有幾個(gè)主要屬性

         _timeBetweenEvictionRunsMillis:失效檢查線程運(yùn)行時(shí)間間隔,默認(rèn)-1

         _maxIdle:對(duì)象池中對(duì)象最大個(gè)數(shù)

         _minIdle:對(duì)象池中對(duì)象最小個(gè)數(shù)

         _maxActive:可以從對(duì)象池中取出的對(duì)象最大個(gè)數(shù),為0則表示沒(méi)有限制,默認(rèn)為8

         在構(gòu)造GenericObjectPool時(shí),會(huì)生成一個(gè)內(nèi)嵌類Evictor,實(shí)現(xiàn)自Runnable接口。如果 _timeBetweenEvictionRunsMillis大于0,每過(guò)_timeBetweenEvictionRunsMillis毫秒 Evictor會(huì)調(diào)用evict()方法,檢查對(duì)象的閑置時(shí)間是否大于 _minEvictableIdleTimeMillis毫秒(_minEvictableIdleTimeMillis小于等于0時(shí)則忽略,默認(rèn)為30 分鐘),是則銷毀此對(duì)象,否則就激活并校驗(yàn)對(duì)象,然后調(diào)用ensureMinIdle方法檢查確保池中對(duì)象個(gè)數(shù)不小于_minIdle。在調(diào)用 returnObject方法把對(duì)象放回對(duì)象池,首先檢查該對(duì)象是否有效,然后調(diào)用PoolableObjectFactory 的passivateObject方法使對(duì)象處于非活動(dòng)狀態(tài)。再檢查對(duì)象池中對(duì)象個(gè)數(shù)是否小于_maxIdle,是則可以把此對(duì)象放回對(duì)象池,否則銷毀此對(duì)象。

         還有幾個(gè)很重要的屬性,_testOnBorrow、_testOnReturn、_testWhileIdle,這些屬性的意義是取得、返回對(duì)象和空閑時(shí)是否進(jìn)行驗(yàn)證,檢查對(duì)象是否有效,默認(rèn)都為false即不驗(yàn)證。所以當(dāng)使用DBCP時(shí),數(shù)據(jù)庫(kù)連接因?yàn)槟撤N原因斷掉后,再?gòu)倪B接池中取得連接又不進(jìn)行驗(yàn)證,這時(shí)取得的連接實(shí)際已經(jīng)時(shí)無(wú)效的數(shù)據(jù)庫(kù)連接了。網(wǎng)上很多說(shuō) DBCP的bug應(yīng)該都是如此吧,只有把這些屬性設(shè)為true,再提供_validationQuery語(yǔ)句就可以保證數(shù)據(jù)庫(kù)連接始終有效了,oracle數(shù)據(jù)庫(kù)可以使用SELECT COUNT(*) FROM DUAL,不過(guò)DBCP要求_validationQuery語(yǔ)句查詢的記錄集必須不為空,可能這也可以算一個(gè)小小的BUG,其實(shí)只要_validationQuery語(yǔ)句執(zhí)行通過(guò)就可以了。

    參考:http://hi.baidu.com/dobodo/item/7d95e3384d181cc4392ffab5



    Tomcat Resource可配置的屬性






    歡迎大家訪問(wèn)我的個(gè)人網(wǎng)站 萌萌的IT人

    posted on 2014-06-27 11:43 一堣而安 閱讀(14939) 評(píng)論(0)  編輯  收藏 所屬分類: javatomcat

    導(dǎo)航

    統(tǒng)計(jì)

    常用鏈接

    留言簿(1)

    隨筆分類

    隨筆檔案

    收藏夾

    搜索

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 五月天婷婷免费视频| 中文字幕亚洲综合久久综合| h视频在线观看免费| 青青青国产色视频在线观看国产亚洲欧洲国产综合 | 亚洲欧洲自拍拍偷午夜色无码| 特色特黄a毛片高清免费观看| 免费jlzzjlzz在线播放视频| 另类小说亚洲色图| 亚洲视频人成在线播放| 国产乱妇高清无乱码免费| 亚洲中文字幕无码久久2017 | 亚洲日韩涩涩成人午夜私人影院| 国产亚洲男人的天堂在线观看| 丁香亚洲综合五月天婷婷| 一级全免费视频播放| 国产av无码专区亚洲av桃花庵| 美丽的姑娘免费观看在线播放| 亚洲av片不卡无码久久| 美女黄网站人色视频免费国产| 免费精品视频在线| 亚洲人成亚洲人成在线观看 | 亚洲国产精品免费观看| 国产精品免费电影| 免费在线观看一区| 久久精品亚洲综合专区| 青青草免费在线视频| 五级黄18以上免费看| 久久久久亚洲AV片无码下载蜜桃| 青娱分类视频精品免费2| 精品在线视频免费| 久久久综合亚洲色一区二区三区 | 亚洲AV无码资源在线观看| 亚洲中文字幕无码一区| 免费观看无遮挡www的视频| 青青青亚洲精品国产| 亚洲国产精品久久久天堂| 一区二区无码免费视频网站 | 久久精品国产亚洲AV网站| 最新猫咪www免费人成| 精品一区二区三区免费观看| 亚洲成AV人片久久|