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

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

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

    super

    使用 apache common dbcp +common pool+mysql連接無效的問題




    Throwable occurred: org.springframework.transaction.CannotCreateTransactionException: Could not open JDBC Connection for transaction; nested exception is com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully received from the server was 50,123,505 milliseconds ago.  The last packet sent successfully to the server was 50,123,505 milliseconds ago. is longer than the server configured value of 'wait_timeout'. You should consider either expiring and/or testing connection validity before use in your application, increasing the server configured values for client timeouts, or using the Connector/J connection property 'autoReconnect=true' to avoid this problem.


    這主要是由兩個原因引起來的:
    1.mysql 會自動關閉長時間不用的connection,一個連接如果處于sleep狀態達到mysql的參數wait_timeout指定的時間(默認為8小時),就是自動關閉這個連接
    2.common pool中沒有指定相應的連接檢查參數


    解決辦法:從common pool的配置參數來解決:

     <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
      <property name="driverClassName">
       <value>${db.driver}</value>
      </property>
      <property name="url">
       <value>${db.url}</value>
      </property>
      <property name="username">
       <value>${db.user}</value>
      </property>
      <property name="password">
       <value>${db.password}</value>
      </property>
      <property name="maxActive">
       <value>100</value>
      </property>
      <property name="maxIdle">
       <value>50</value>
      </property>
      <property name="maxWait">
       <value>10000</value>
      </property>


      <property name="timeBetweenEvictionRunsMillis">
       <value>3600000</value><!--1 hours-->
      </property>

    <!--
      <property name="minEvictableIdleTimeMillis">
       <value>20000</value>
      </property>
    -->
      
      <property name="testWhileIdle">
       <value>true</value>
      </property>
      <property name="validationQuery">
       <value>select 1 from dual</value>
      </property>

     </bean>

    使用上述的三個紅色的參數,就可以避免這個問題.這三個參數的意義:

    timeBetweenEvictionRunsMillis:啟動connection校驗定時器,定時器運行時間間隔就是timeBetweenEvictionRunsMillis的值.默認為-1,表示不啟動定時器,這里設定為1小時,只要小于mysql的wait_timeout就可以了

    testWhileIdle: true,表示檢查idle的connection,false為不檢查

    validationQuery:用于檢查connection的sql語句.


    這只是一種方法,另外的幾種方法:

    timeBetweenEvictionRunsMillis+minEvictableIdleTimeMillis:這種方式不檢查Connection的有效性,而是檢查連接的空閑時間,大于minEvictableIdleTimeMillis就清除.

      <property name="timeBetweenEvictionRunsMillis">
       <value>3600000</value><!--1 hours-->
      </property>

      <property name="minEvictableIdleTimeMillis">
       <value>120000</value><!--connection的空閑時間大于這個值,就直接被關閉,并從連接池中刪除-->
      </property>


    如果不喜歡用定時器,也可以配置testOnBorrow+validationQuery參數:每次從連接池取參數都會校驗連接的有效性.實際上這種方式性能會比定時器差些.
      <property name="testOnBorrow">
       <value>true</value>
      </property>
      <property name="validationQuery">
       <value>select 1 from dual</value>
      </property>


    另外,也可以用testOnReturn+validationQuery,不過未必會解決問題:這表示每次使用完連接,歸還連接池的時候檢查連接的有效性,這有可能導致使用一次無效的連接,最好不要用.


    上面的幾種方法可以合并使用,只是檢查的點多了,未必是好事


    另外,也可以使用Abandoned的那幾個參數,來刪除連接池中的連接.也能達到效果.我沒測試.











    posted on 2010-09-15 17:57 王衛華 閱讀(2448) 評論(0)  編輯  收藏 所屬分類: spring


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


    網站導航:
     
    主站蜘蛛池模板: 亚洲国产成人爱av在线播放| 日韩免费无码一区二区三区| 卡1卡2卡3卡4卡5免费视频 | 精品亚洲一区二区三区在线观看 | 精品亚洲成a人片在线观看 | 国产成人免费爽爽爽视频| 亚洲韩国在线一卡二卡| 99免费视频观看| 亚洲老熟女@TubeumTV| 国产曰批免费视频播放免费s| 亚洲成综合人影院在院播放| 91精品国产免费久久久久久青草| 亚洲色图.com| 免费无码AV片在线观看软件| 亚洲人成电影网站色www| 国产免费看插插插视频| 特级无码毛片免费视频| 亚洲无人区一区二区三区| 日韩电影免费在线观看网站| 亚洲综合日韩中文字幕v在线| 最近2019中文字幕免费直播 | 亚洲福利秒拍一区二区| 成人免费毛片观看| 成年网站免费入口在线观看 | 国产亚洲精品精品精品| 久久精品国产亚洲AV不卡| 日本免费污片中国特一级| 亚洲精品欧洲精品| 国产精品免费_区二区三区观看| 男性gay黄免费网站| 亚洲国产精品va在线播放 | www亚洲精品少妇裸乳一区二区| 精品熟女少妇aⅴ免费久久| 亚洲图片一区二区| 精品免费国产一区二区| 国产免费久久精品99久久| 亚洲自偷自拍另类图片二区| 可以免费观看的一级毛片| 男人进去女人爽免费视频国产| 天堂亚洲国产中文在线| 怡红院亚洲怡红院首页|