隨筆-204  評論-90  文章-8  trackbacks-0
          摘自springside論壇

          一、
          經過N多試驗,終于自己把這個問題搞定了。

          網上關于C3P0在spring中的配置,幾乎沒有完全正確的(至少我還沒發現)。查了c3p0的文檔,又試驗過N次。得出如下配置是正確的:


          <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"? ?destroy-method="close">
          ? ?? ?? ?<property name="driverClass"><value>${jdbc.driverClassName}</value></property>
          ? ?? ?? ?<property name="jdbcUrl"><value>${jdbc.url}</value></property>? ?? ?? ?? ?? ?
          ? ?? ?? ?<property name="user"><value>${jdbc.username}</value></property>
          ? ?? ?? ?<property name="password"><value>${jdbc.password}</value></property>
          ? ?? ?? ?
          ? ?? ?? ?<property name="minPoolSize"><value>1</value></property>
          ? ?? ?? ?<property name="maxPoolSize"><value>20</value></property>
          ? ?? ?? ?<property name="maxIdleTime"><value>1800</value></property>
          ? ?? ?? ?<property name="acquireIncrement"><value>2</value></property>
          ? ?? ?? ?<property name="maxStatements"><value>0</value></property>
          ? ?? ?? ?<property name="initialPoolSize"><value>2</value></property>
          ? ?? ?? ?<property name="idleConnectionTestPeriod"><value>1800</value></property>
          ? ?? ?? ?<property name="acquireRetryAttempts"><value>30</value></property>
          ? ?? ?? ?<property name="breakAfterAcquireFailure"><value>true</value></property>
          ? ?? ?? ?<property name="testConnectionOnCheckout"><value>false</value></property>
          ? ?? ?? ?
          ? ?? ?? ?<!--
          ? ?? ?? ?? ?<property name="properties">
          ? ?? ?? ? <props>? ?? ?? ?? ???
          ? ?? ?? ?? ???<prop key="c3p0.minPoolSize">1</prop>
          ? ?? ?? ?? ???<prop key="c3p0.maxPoolSize">10</prop>
          ? ?? ?? ?? ???<prop key="c3p0.maxIdleTime">1800</prop>? ?? ?? ?? ???
          ? ?? ?? ?? ???<prop key="c3p0.acquireIncrement">2</prop>
          ? ?? ?? ?? ???<prop key="c3p0.maxStatements">0</prop>
          ? ?? ?? ?? ?? ?? ???<prop key="c3p0.initialPoolSize">2</prop>
          ? ?? ?? ?? ???<prop key="c3p0.idleConnectionTestPeriod">1800</prop>
          ? ?? ?? ?? ???<prop key="c3p0.acquireRetryAttempts">30</prop>
          ? ?? ?? ?? ???<prop key="c3p0.breakAfterAcquireFailure">true</prop>
          ? ?? ?? ?? ???<prop key="c3p0.testConnectionOnCheckout">true</prop>
          ? ?? ?? ?? ???<prop key="user">root</prop>
          ? ?? ?? ?? ???<prop key="password">999999</prop>
          ? ?? ?? ?? ???
          ? ?? ?? ? </props>
          ? ?? ?? ?</property>
          ? ?? ???-->? ?? ?
          </bean>

          <!-- Hibernate SessionFactory -->
          <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
          ??<property name="dataSource" ref="dataSource"/>
          ??<property name="mappingDirectoryLocations">
          ? ?? ?<list>
          ? ?<value>classpath:/com/licaionline/domain/</value>
          ? ?? ?</list>
          ??</property>
          ??<property name="hibernateProperties">
          ? ?<props>
          ? ? <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
          ? ???<prop key="hibernate.show_sql">true</prop>
          ? ? <prop key="hibernate.generate_statistics">true</prop>
          ? ?? ?? ?? ?? ? <prop key="hibernate.connection.release_mode">auto</prop>? ?? ?? ?? ?? ?? ?? ?
          ? ?? ?? ?? ?? ? <prop key="hibernate.autoReconnect">true</prop>
          ? ?? ?? ?? ?? ? <prop key="hibernate.cglib.use_reflection_optimizer">true</prop>
          ? ?? ?? ?? ?? ? <!--
          ? ? <prop key="hibernate.useUnicode"></prop>
          ? ? <prop key="hibernate.characterEncoding"></prop>
          ? ? <prop key="hibernate.default-lazy-init"></prop>
          ? ?? ?? ?? ?? ? <prop key="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</prop>? ???
          ? ? -->
          ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???
          ? ?? ?? ?? ?? ? <!--
          ? ?? ?? ?? ?? ? <prop key="hibernate.c3p0.acquire_increment">2</prop>
          ? ?? ?? ?? ?? ? <prop key="hibernate.c3p0.idle_test_period">1800</prop>
          ? ?? ?? ?? ?? ? <prop key="hibernate.c3p0.timeout">1800</prop>
          ? ?? ?? ?? ?? ? <prop key="hibernate.c3p0.max_size">30</prop>
          ? ?? ?? ?? ?? ? <prop key="hibernate.c3p0.min_size">2</prop>
          ? ?? ?? ?? ?? ? <prop key="hibernate.c3p0.max_statements">50</prop>
          ? ? -->? ?? ?? ?
          ? ?</props>
          ??</property>




          注意:注釋掉的那些,都是錯誤的。網上流行的,基本上跟注釋掉的那些差不多。配錯了,并無異常,還是能正常使用。但是所作的配置不起作用。


          二、
          起作用的,是datasource里面的這一句:
          <property name="maxIdleTime"><value>1800</value></property>

          這兒設置成每隔1800秒就掃描一次,檢查一下空閑的鏈接。所以,用戶基本上不會得到空閑的鏈接了。

          如果再不放心,
          <property name="testConnectionOnCheckout"><value>false</value></property>
          這兒設置成true。每次連接之前,都要測一下。但是這樣會影響效率。


          三、

          解決的方法有3種:

          增加wait_timeout的時間。
          減少Connection pools中connection的lifetime。
          測試Connection pools中connection的有效性。
          當然最好的辦法是同時綜合使用上述3種方法,下面就DBCP和C3P0分別做一說明,假設wait_timeout為默認的8小時

          DBCP增加以下配置信息:

          //set to 'SELECT 1'? ?
          validati? ?
          //set to 'true'? ?
          testWhileIdle = "true"? ???
          //some positive integer? ?
          timeBetweenEvictionRunsMillis = 3600000? ?
          //set to something smaller than 'wait_timeout'? ?
          minEvictableIdleTimeMillis = 18000000? ?
          //if you don't mind a hit for every getConnection(), set to "true"? ?
          test? ?

          C3P0增加以下配置信息:

          //set to 'SELECT 1'? ?? ?
          preferredTestQuery = 'SELECT 1'? ???
          //set to something much less than wait_timeout, prevents connections from going stale? ?
          idleConnectionTestPeriod = 18000? ?? ?
          //set to something slightly less than wait_timeout, preventing 'stale' connections from being handed out? ?
          maxIdleTime = 25000? ???
          //if you can take the performance 'hit', set to "true"? ?
          testConnectionOnCheckout = true? ???

          更多的配置信息大家可以查看C3P0文檔,Connector/J文檔,以及DBCP的文檔。

          posted on 2007-01-10 15:33 一凡 閱讀(4119) 評論(10)  編輯  收藏 所屬分類: JAVA FRAMEWORK

          評論:
          # re: 每日訪問數據庫失敗問題 2007-03-18 15:18 | 流浪汗
          我這個問題

          同感,當去掉<property name="properties">
          時正確

          否則第一次連接時出錯

          org.hibernate.exception.JDBCConnectionException: could not execute query

          然后找到你的文章,收藏了.

          你總結的很好

          我的環境是
          spring 2.0
          hibernate 3.1.2
          c3p0-0.9.0.4  回復  更多評論
            
          # re: 每日訪問數據庫失敗問題 2007-10-19 10:42 | mashiguang
          c3p0的最大空閑時間為什么不起作用呢.

          有時間的話幫我看一下這個貼子,http://www.javaeye.com/topic/133254
          謝謝.  回復  更多評論
            
          # re: 每日訪問數據庫失敗問題 2007-10-19 10:50 | 一凡
          配置文件里加上這句
          <property name="maxIdleTime"><value>1800</value></property>  回復  更多評論
            
          # re: 每日訪問數據庫失敗問題 2007-10-19 10:51 | 一凡
          不要在程序里設置,讓它自己初始化就好  回復  更多評論
            
          # re: 每日訪問數據庫失敗問題 2007-10-19 10:54 | mashiguang
          我沒有用spring,
          ComboPooledDataSource dataSource=new ComboPooledDataSource();
          dataSource.setMaxIdleTime(9);
          這樣設置不是一樣的嗎??  回復  更多評論
            
          # re: 每日訪問數據庫失敗問題 2007-10-19 11:06 | 一凡
          按理說應該沒問題,連接池這東西說不好,我遇到過程序寫不行,在配制文件里就沒問題  回復  更多評論
            
          # re: 每日訪問數據庫失敗問題 2007-10-19 11:11 | mashiguang
          好的,我試一下,謝謝你.  回復  更多評論
            
          # re: 每日訪問數據庫失敗問題[未登錄] 2008-05-19 14:02 | alfred
          <prop key="c3p0.idleConnectionTestPeriod">1800</prop>
          <prop key="c3p0.maxIdleTime">1800</prop>
          這兩都都是檢查空閑的,maxidelteime檢查到空閑會丟掉。
          idleConnectionTestPeriod 有什么作用呢?  回復  更多評論
            
          # re: 每日訪問數據庫失敗問題 2010-06-05 21:03 | moka
          <!--每30秒檢查所有連接池中的空閑連接。Default: 0 -->
          <property name="idleConnectionTestPeriod">30</property>
          指每個連接sleep time只要一到${idleConnectionTestPeriod}秒就將sleep time從頭開始計時

          <!--最大空閑時間,60秒內未使用則連接被丟棄。若為0則永不丟棄。Default: 0 -->
          <property name="maxIdleTime">60</property>
          指每個連接sleep time只要一到${maxIdleTime}秒就將該線程殺掉(kill)

          只要連接池里的連接一使用,sleep time就會從頭開始計時  回復  更多評論
            
          # re: 每日訪問數據庫失敗問題 2011-09-30 22:44 | showzh
          隨便問一句,為什么hibernate.c3p0.timeout沒起作用?  回復  更多評論
            
          主站蜘蛛池模板: 三都| 长治市| 马龙县| 湟中县| 陆良县| 阿尔山市| 逊克县| 高邮市| 桃园县| 涞源县| 元谋县| 阜南县| 舟山市| 拉萨市| 绥棱县| 道孚县| 应城市| 巴里| 叶城县| 赤壁市| 唐海县| 句容市| 湖北省| 久治县| 新营市| 铜鼓县| 兴宁市| 巴中市| 东兴市| 北海市| 新丰县| 轮台县| 阿瓦提县| 交口县| 清水河县| 通州区| 富平县| 铅山县| 佳木斯市| 滦平县| 蓬安县|