1. 程式人生 > >DBCP與c3p0__連線池引數詳細說明

DBCP與c3p0__連線池引數詳細說明

dbcp:
driverClassName
url
username
password
上面四個分別是驅動,連線字串,使用者名稱和密碼

maxActive 連線池支援的最大連線數
maxIdle 連線池中最多可空閒maxIdle個連線
minIdle 連線池中最少空閒maxIdle個連線
initialSize 初始化連線數目
maxWait 連線池中連線用完時,新的請求等待時間,毫秒
timeBetweenEvictionRunsMillis timeBetweenEvictionRunsMillis和minEvictableIdleTimeMillis一起使用,每

timeBetweenEvictionRunsMillis毫秒秒檢查一次連線池中空閒的連線,把空閒時間超過minEvictableIdleTimeMillis毫秒的連線斷開,直到連線池中的連線數到minIdle為止

minEvictableIdleTimeMillis 連線池中連線可空閒的時間,毫秒

removeAbandoned true,false,是否清理removeAbandonedTimeout秒沒有使用的活動連線,清理後並沒有放回連線池
removeAbandonedTimeout 活動連線的最大空閒時間
logAbandoned true,false,連線池收回空閒的活動連線時是否列印訊息


minEvictableIdleTimeMillis,removeAbandonedTimeout這兩個引數針對的連線物件不一樣,minEvictableIdleTimeMillis針對連線池中的連線物件,removeAbandonedTimeout針對未被close的活動連線.

在配置時,主要難以理解的主要有:removeAbandoned 、logAbandoned、removeAbandonedTimeout、maxWait這四個引數,設定了rmoveAbandoned=true那麼在getNumActive()快要到getMaxActive()的時候,系統會進行無效的Connection的回收,回收的Connection為removeAbandonedTimeout(預設300秒)中設定的秒數後沒有使用的Connection,啟用回收機制好像是getNumActive()=getMaxActive()-2。 :)   logAbandoned=true的話,將會在回收事件後,在log中打印出回收Connection的錯誤資訊,包括在哪個地方用了Connection卻忘記關閉了,在除錯的時候很有用。
  在這裡私人建議maxWait的時間不要設得太長,maxWait如果設定太長那麼客戶端會等待很久才激發回收事件。
  以下配置的properties檔案:
#連線設定
jdbc.driverClassName=oracle.jdbc.driver.OracleDriver
jdbc.url=jdbc:oracle:thin:@127.0.0.1:1521:DBSERVER
jdbc.username=user
jdbc.password=pass

#<!-- 初始化連線 -->
dataSource.initialSize=10

#<!-- 最大空閒連線 -->
dataSource.maxIdle=20

#<!-- 最小空閒連線 -->
dataSource.minIdle=5

#最大連線數量
dataSource.maxActive=50

#是否在自動回收超時連線的時候列印連線的超時錯誤
dataSource.logAbandoned=true

#是否自動回收超時連線(這個要看業務需要是否配置,比如執行儲存過程或者同步其它部件表,這個需要的時間比較長,所以不能配置該項,預設為,false)
dataSource.removeAbandoned=true

#超時時間(以秒數為單位)
#設定超時時間有一個要注意的地方,超時時間=現在的時間-程式中建立Connection的時間,如果maxActive比較大,比如超過100,那麼removeAbandonedTimeout可以設定長一點比如180,也就是三分鐘無響應的連線進行回收,當然應用的不同設定長度也不同。
dataSource.removeAbandonedTimeout=180

#<!-- 超時等待時間以毫秒為單位 -->
#maxWait代表當Connection用盡了,多久之後進行回收丟失連線
dataSource.maxWait=1000

專案裡配置:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName">
            <value>${jdbc.driver}</value>
        </property>
        <property name="url">
            <value>${jdbc.url}</value>
        </property>
        <property name="username">
            <value>${jdbc.username}</value>
        </property>
        <property name="password">
            <value>${jdbc.password}</value>
        </property>
        <property name="maxActive">
            <value>${jdbc.maxActive}</value>
        </property>
        <property name="maxIdle">
            <value>${jdbc.maxIdle}</value>
        </property>
        <property name="minIdle"><value>${jdbc.minIdle}</value></property>
        <property name="initialSize"><value>${jdbc.initialSize}</value></property>
        <!--  <property name="removeAbandonedTimeout"><value>120</value></property>
        <property name="removeAbandoned"><value>true</value></property>
        -->
        <property name="timeBetweenEvictionRunsMillis"><value>${jdbc.timeBetweenEvictionRunsMillis}</value>         </property>
        <property name="numTestsPerEvictionRun"><value>${jdbc.numTestsPerEvictionRun}</value></property>
        <property name="minEvictableIdleTimeMillis"><value>${jdbc.minEvictableIdleTimeMillis}</value></property>
       
        <property name="testOnBorrow" value="true"/>
        <property name="validationQuery" value="${jdbc.getdate.sql}"/>       
    </bean>

jdbc.driver=oracle.jdbc.driver.OracleDriver
jdbc.url=jdbc:oracle:thin:@192.168.1.1:1521:shili
jdbc.username=myname
jdbc.password=111
jdbc.maxActive=5
jdbc.maxIdle=5
jdbc.minIdle=5
jdbc.initialSize=5
jdbc.timeBetweenEvictionRunsMillis=60000
jdbc.numTestsPerEvictionRun=5
jdbc.minEvictableIdleTimeMillis=30000
jpa.database=ORACLE
jpa.showSql=false
jpa.generateDdl=false
jdbc.getdate.sql=select sysdate from dual     (注意mysql資料庫validationQuery這裡的值是:select 1

引數  預設值  描述
validationQuery   SQL查詢,用來驗證從連線池取出的連線,在將連線返回給呼叫者之前.如果指定,
則查詢必須是一個SQL SELECT並且必須返回至少一行記錄
testOnBorrow  true  指明是否在從池中取出連線前進行檢驗,如果檢驗失敗,
則從池中去除連線並嘗試取出另一個.
注意: 設定為true後如果要生效,validationQuery引數必須設定為非空字串

http://www.blogjava.net/wangxinsh55/archive/2011/04/14/348277.html

validationQuery 說明

還有幾個很重要的屬性,_testOnBorrow、_testOnReturn、_testWhileIdle,這些屬性的意義是取得、返回物件和空閒時是否進行驗證,檢查物件是否有效,預設都為false即不驗證。所以當使用DBCP時,資料庫連線因為某種原因斷掉後,再從連線池中取得連線又不進行驗證,這時取得的連線實際已經時無效的資料庫連線了。網上很多說DBCP的bug應該都是如此吧,只有把這些屬性設為true,再提供_validationQuery語句就可以保證資料庫連線始終有效了

http://blog.csdn.net/sandyen/article/details/723635

 http://fine36.blog.163.com/blog/static/189251005201182144143661/



c3p0:
driverClass
jdbcUrl
user
password
minPoolSize
maxPoolSize
initialPoolSize

acquireIncrement 池中沒有空閒連線時,一次請求獲取的連線數
maxIdleTime 池中連線最大空閒時間
acquireRetryAttempts 獲取連線失敗後,重新嘗試的次數
acquireRetryDelay 嘗試連線間隔時間,毫秒
checkoutTimeout 等待連線時間,0為無限等待,毫秒
DebugUnreturnedConnectionStackTraces true,false,是否收回未返回的活動連線
unreturnedConnectionTimeout 活動連線的時間.

總結專案裡面的問題:

資料庫的連線:

1、讀取資料的連線是實時的,如果資料庫停了,那麼會直接報錯,不會自動再次連線或等待連線。

2、如果已經執行查詢,那麼超時由配置決定(看業務需要)

dataSource.removeAbandoned=true

dataSource.removeAbandonedTimeout=180

資料庫的連線和釋放是由呼叫的第三方部件決定

1、spring 提供的org.springframework.jdbc.core.JdbcTemplate會自己呼叫連線自己釋放。(可以檢視原始碼裡面的execute方法)

2、已經宣告事務的,由事務管理:

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory" />
    </bean>

 在方法或者類的上面標識@Transactional 。

3、直接使用Hibernate:

使用Hibernate時,大家一般都記住了配置基本的那些選項,比如方言,快取等,但是有一項配置卻很容易忘掉,這就是連線釋放模式:hibernate.connection.release_mode,可有三個選擇,after_statement/after_transaction/on_close,javadoc中可以看出它們的用處,這裡不再講,注意的一點是,如果不配置的話預設是on_close,那麼如果沒有顯示的去呼叫session.close或其它關閉連線的方法的話,這個連線是不會被關閉的!在用到連線池的時候,這就更體現出問題了:池中的連線會一直存在著而不會被關閉和回收!
  從log4j打印出來的日誌也可以看出來,如果是on_close模式,則:
transaction completed on session with on_close connection release mode; be sure to close the session to release JDBC resources!
  具體的一些細節可以看看hibernate的原始碼,涉及到的兩個類為:
  org.hibernate.ConnectionReleaseMode
  org.hibernate.jdbc.ConnectionManager

  最後,貼一下配置的程式碼:
  <prop key="hibernate.connection.release_mode">after_transaction</prop>

對於應用session超時設定:

前兩個都是修改tomcat的配置檔案conf
1. 在server.xml中定義context時採用如下定義:
xml 程式碼
<Context path="/livsorder" docBase="/home/httpd/html/livsorder"      
  defaultSessionTimeOut="3600" isWARExpanded="true"      
  isWARValidated="false" isInvokerEnabled="true"      
  isWorkDirPersistent="false"/>  
3600秒=1小時
2. 在web.xml中通過引數指定:
xml 程式碼
<session-config>    
    <session-timeout>30</session-timeout>      
</session-config>  

其中30表示30分鐘

3. 在程式中通過servlet api直接修改

java 程式碼


HttpSession ses = request.getSession();   
ses.setMaxInactiveInterval(10);  

設定單位為秒,設定為-1永不過期。