乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      開源JDBC連接池DBCP和C3P0配置小結(jié)

       燮羽 2010-11-02
      一、寫在最前面

          最近公司某項目從Weblogic遷移到Tomcat后連接池出了嚴(yán)重問題,間歇性的出現(xiàn)如下連接異常。
      java.sql.SQLException: Already closed.
      java.sql.SQLException: Io 異常: Connection reset by peer: socket write error
      而且,一段時間后系統(tǒng)將因為資源被占用完,出現(xiàn)系統(tǒng)完全癱瘓的情況。

      二、分析問題

          開始分析認(rèn)為,是應(yīng)用服務(wù)器和數(shù)據(jù)庫服務(wù)器之間網(wǎng)絡(luò)鏈路出了問題,比如防火墻策略被更改等引起的連接不穩(wěn)定導(dǎo)致連接異常中斷被掛起不能正常釋放資源。但網(wǎng)絡(luò)人員一口咬定網(wǎng)絡(luò)正常,的確我在兩臺服務(wù)器之間發(fā)送1M的數(shù)據(jù)包,響應(yīng)很快也很穩(wěn)定。遂排除了這種假設(shè)。
          排除網(wǎng)絡(luò)因素,那就只有考慮連接池了。以前在weblogic上使用其自帶的連接池沒出現(xiàn)這種情況?,F(xiàn)在Tomcat下使用的是公司框架默認(rèn)的Apache DBCP連接池。此種連接池雖出自名門Apache基金會。但口碑不是很好,在新版的Hibernate中已經(jīng)放棄了對DBCP的支持,取而代之的是C3P0。開始我還對DBCP抱有希望,加上各種參數(shù)設(shè)置,但均無效。后來換上了C3P0,使用其testConnectionOnCheckout、testConnectionOnCheckin參數(shù)配置后果然一劍封喉的解決了問題。(說明:此種辦法其實會帶來一定的性能損耗)

      三、DBCP和C3P0連接池常用配置參數(shù)一覽表

      DBCP配置
              <bean id="hospitalDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
              <property name="driverClassName"><value>${jdbcHospital.driverClassName}</value></property>
              <property name="url"><value>${jdbcHospital.url}</value></property>
              <property name="username"><value>${jdbcHospital.username}</value></property>
              <property name="password"><value>${jdbcHospital.password}</value></property>
              <property name="initialSize" value="10" />
              <property name="maxActive" value="100" />
              <property name="maxIdle" value="30" />
              <property name="minIdle" value="10" />
              <property name="logAbandoned" value="true" />
              <property name="removeAbandoned" value="true" />
              <property name="removeAbandonedTimeout" value="1000" />
              <property name="maxWait" value="5000" />
              </bean>
      defaultAutoCommit:設(shè)置從數(shù)據(jù)源中返回的連接是否采用自動提交機(jī)制,默認(rèn)值為 true;
      defaultReadOnly:設(shè)置數(shù)據(jù)源是否僅能執(zhí)行只讀操作, 默認(rèn)值為 false;
      maxActive:最大連接數(shù)據(jù)庫連接數(shù),設(shè)置為0時,表示沒有限制;
      maxIdle:最大等待連接中的數(shù)量,設(shè)置為0時,表示沒有限制;
      maxWait:最大等待秒數(shù),單位為毫秒, 超過時間會報出錯誤信息;
      validationQuery:用于驗證連接是否成功的查詢SQL語句,SQL語句必須至少要返回一行數(shù)據(jù), 如你可以簡單地設(shè)置為:“select count(*) from user”;
      removeAbandoned:是否自我中斷,默認(rèn)是 false ;
      removeAbandonedTimeout:幾秒后數(shù)據(jù)連接會自動斷開,在removeAbandoned為true,提供該值;
      logAbandoned:是否記錄中斷事件, 默認(rèn)為 false;

      C3P0配置
              <bean id="hospitalDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
              <property name="driverClass" value="${jdbcHospital.driverClassName}" />
              <property name="jdbcUrl" value="${jdbcHospital.url}" />
              <property name="user" value="${jdbcHospital.username}" />
              <property name="password" value="${jdbcHospital.password}" />
              <property name="maxPoolSize" value="60" />
              <property name="minPoolSize" value="10" />
              <property name="initialPoolSize" value="10" />
              <property name="breakAfterAcquireFailure" value="true" />
              <property name="testConnectionOnCheckout" value="true" />
              <property name="testConnectionOnCheckin" value="true" />       
              </bean>
      C3P0擁有比DBCP更豐富的配置屬性,通過這些屬性,可以對數(shù)據(jù)源進(jìn)行各種有效的控制:
      acquireIncrement:當(dāng)連接池中的連接用完時,C3P0一次性創(chuàng)建新連接的數(shù)目;
      acquireRetryAttempts:定義在從數(shù)據(jù)庫獲取新連接失敗后重復(fù)嘗試獲取的次數(shù),默認(rèn)為30;
      acquireRetryDelay:兩次連接中間隔時間,單位毫秒,默認(rèn)為1000;
      autoCommitOnClose:連接關(guān)閉時默認(rèn)將所有未提交的操作回滾。默認(rèn)為false;
      automaticTestTable: C3P0將建一張名為Test的空表,并使用其自帶的查詢語句進(jìn)行測試。如果定義了這個參數(shù),那么屬性preferredTestQuery將被忽略。你不能在這張Test表上進(jìn)行任何操作,它將中為C3P0測試所用,默認(rèn)為null;
      breakAfterAcquireFailure:獲取連接失敗將會引起所有等待獲取連接的線程拋出異常。但是數(shù)據(jù)源仍有效保留,并在下次調(diào)   用getConnection()的時候繼續(xù)嘗試獲取連接。如果設(shè)為true,那么在嘗試獲取連接失敗后該數(shù)據(jù)源將申明已斷開并永久關(guān)閉。默認(rèn)為 false;
      checkoutTimeout:當(dāng)連接池用完時客戶端調(diào)用getConnection()后等待獲取新連接的時間,超時后將拋出SQLException,如設(shè)為0則無限期等待。單位毫秒,默認(rèn)為0;
      connectionTesterClassName:通過實現(xiàn)ConnectionTester或QueryConnectionTester的類來測試連接,類名需設(shè)置為全限定名。默認(rèn)為 com.mchange.v2.C3P0.impl.DefaultConnectionTester;
      idleConnectionTestPeriod:隔多少秒檢查所有連接池中的空閑連接,默認(rèn)為0表示不檢查;
      initialPoolSize:初始化時創(chuàng)建的連接數(shù),應(yīng)在minPoolSize與maxPoolSize之間取值。默認(rèn)為3;
      maxIdleTime:最大空閑時間,超過空閑時間的連接將被丟棄。為0或負(fù)數(shù)則永不丟棄。默認(rèn)為0;
      maxPoolSize:連接池中保留的最大連接數(shù)。默認(rèn)為15;
      maxStatements:JDBC的標(biāo)準(zhǔn)參數(shù),用以控制數(shù)據(jù)源內(nèi)加載的PreparedStatement數(shù)量。但由于預(yù)緩存的Statement屬于單個Connection而不是整個連接池。所以設(shè)置這個參數(shù)需要考慮到多方面的因素,如果maxStatements與 maxStatementsPerConnection均為0,則緩存被關(guān)閉。默認(rèn)為0;
      maxStatementsPerConnection:連接池內(nèi)單個連接所擁有的最大緩存Statement數(shù)。默認(rèn)為0;
      numHelperThreads:C3P0是異步操作的,緩慢的JDBC操作通過幫助進(jìn)程完成。擴(kuò)展這些操作可以有效的提升性能,通過多線程實現(xiàn)多個操作同時被執(zhí)行。默認(rèn)為3;
      preferredTestQuery:定義所有連接測試都執(zhí)行的測試語句。在使用連接測試的情況下這個參數(shù)能顯著提高測試速度。測試的表必須在初始數(shù)據(jù)源的時候就存在。默認(rèn)為null;
      propertyCycle: 用戶修改系統(tǒng)配置參數(shù)執(zhí)行前最多等待的秒數(shù)。默認(rèn)為300;
      testConnectionOnCheckout:因性能消耗大請只在需要的時候使用它。如果設(shè)為true那么在每個connection提交的時候都將校驗其有效性。建議使用idleConnectionTestPeriod或automaticTestTable
      等方法來提升連接測試的性能。默認(rèn)為false;
      testConnectionOnCheckin:如果設(shè)為true那么在取得連接的同時將校驗連接的有效性。默認(rèn)為false。

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多