天天看點

帆軟報表FineReport中資料連接配接的JDBC連接配接池屬性問題

連接配接池原理

在帆軟報表FineReport中,連接配接池主要由三部分組成:連接配接池的建立、連接配接池中連接配接使用的治理、連接配接池的關閉。下面就着重讨論這三部分及連接配接池的配置問題。

1. 連接配接池原理

連接配接池技術的核心思想,是連接配接複用,通過建立一個資料庫連接配接池以及一套連接配接使用、配置設定、治理政策,使得該連接配接池中的連接配接可以得到高效、安全的複用,避免了資料庫連接配接頻繁建立、關閉的開銷。

另外,由于對JDBC中的原始連接配接進行了封裝,進而友善了資料庫應用對于連接配接的使用(特别是對于事務處理),提高了開發效率,也正是因為這個封裝層的存在,隔離了應用的本身的處理邏輯和具體資料庫通路邏輯,使應用本身的複用成為可能。

1.1 連接配接池的建立

應用程式中建立的連接配接池其實是一個靜态的。所謂靜态連接配接池是指連接配接池中的連接配接在系統初始化時就已配置設定好,且不能随意關閉連接配接。Java中提供了很多容器類可以友善的建構連接配接池,如:Vector、Stack、Servlet、Bean等,通過讀取連接配接屬性檔案Connections.properties與資料庫執行個體建立連接配接。在系統初始化時,根據相應的配置建立連接配接并放置在連接配接池中,以便需要使用時能從連接配接池中擷取,這樣就可以避免連接配接随意的建立、關閉造成的開銷。

1.2 連接配接池的管理

連接配接池管理政策是連接配接池機制的核心。當連接配接池建立後,如何對連接配接池中的連接配接進行管理,解決好連接配接池内連接配接的配置設定和釋放,對系統的性能有很大的影響。連接配接的合理配置設定、釋放可提高連接配接的複用,降低了系統建立新連接配接的開銷,同時也加速了使用者的通路速度。下面介紹連接配接池中連接配接的配置設定、釋放政策。

連接配接池的配置設定、釋放政策對于有效複用連接配接非常重要,我們采用的方法是一個很有名的設計模式:Reference Counting(引用記數)。該模式在複用資源方面應用的非常廣泛,把該方法運用到對于連接配接的配置設定釋放上,為每一個資料庫連接配接,保留一個引用記數,用來記錄該連接配接的使用者的個數。

具體實作方法如下:

當客戶請求資料庫連接配接時,首先檢視連接配接池中是否有空閑連接配接(指目前沒有配置設定出去的連接配接)。如果存在空閑連接配接,則把連接配接配置設定給客戶并作相應處理(即标記該連接配接為正在使用,引用計數加1)。如果沒有空閑連接配接,則檢視目前所開的連接配接數是不是已經達到maxConn(最大連接配接數),如果沒達到就重新建立一個連接配接給請求的客戶;如果達到就按設定的maxWaitTime(最大等待時間)進行等待,如果等待maxWaitTime後仍沒有空閑連接配接,就抛出無空閑連接配接的異常給使用者。

當客戶釋放資料庫連接配接時,先判斷該連接配接的引用次數是否超過了規定值,如果超過就删除該連接配接,并判斷目前連接配接池内總的連接配接數是否小于minConn(最小連接配接數),若小于就将連接配接池充滿;如果沒超過就将該連接配接标記為開放狀态,可供再次複用。可以看出正是這套政策保證了資料庫連接配接的有效複用,避免頻繁地建立、釋放連接配接所帶來的系統資源開銷。

1.3 連接配接池的關閉

當應用程式退出時,應關閉連接配接池,此時應把在連接配接池建立時向資料庫申請的連接配接對象統一歸還給資料庫(即關閉所有資料庫連接配接),這與連接配接池的建立正好是一個相反過程。

連接配接池配置設定一個連接配接後如定義一個資料集,點選預覽,執行完對應的sql語句會将所占用的連接配接歸還連接配接池。

2. 連接配接池的配置

資料庫連接配接池中到底要放置多少個連接配接,才能使系統的性能更佳,用minConn和maxConn來限制。

minConn是當應用啟動的時候連接配接池所建立的連接配接數,假如過大啟動将變慢,但是啟動後響應更快;假如過小啟動加快,但是最初使用的使用者将因為連接配接池中沒有足夠的連接配接不可避免的延緩了執行速度。是以應該在開發的過程中設定較小minConn,而在實際應用的中設定較大minConn。maxConn是連接配接池中的最大連接配接數,可以通過反複試驗來确定此飽和點。

為此在連接配接池類ConnectionPool中加入兩個方法getActiveSize()和getOpenSize(),ActiveSize 表示某一時間有多少連接配接正被使用,OpenSize表示連接配接池中有多少連接配接被打開,反映了連接配接池使用的峰值。将這兩個值在日志資訊中反應出來, minConn的值應該小于平均ActiveSize,而maxConn的值應該在activeSize和OpenSize之間。

連接配接池屬性

1. 問題描述

FineReport連接配接池屬性,使用的是DBCP連接配接池,下面介紹其設定方法及其屬性中各參數的意義;如果通路模闆時,報連接配接逾時、等待狀态,警告如下:

1. 警告:Cannot get a connection, pool error Timeout waiting for idle object  

2.     at com.fr.third.org.apache.commons.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:114)  

3.     at com.fr.third.org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044)  

4.     at com.fr.data.pool.MemoryConnection.create(Unknown Source)  

5.     at com.fr.data.impl.JDBCDatabaseConnection.createConnection(Unknown Source)  

則需要把相應連接配接數調大。

2. 設定方法

點選伺服器>定義資料連接配接,如下圖所示,點選連接配接池屬性,彈出連接配接池屬性編輯框:

帆軟報表FineReport中資料連接配接的JDBC連接配接池屬性問題

這裡的資訊都儲存在%FR_HOME%\WebReport\WEB-INF\resources\datasource.xml檔案下:

<DBCPAttr

initialSize="1"

maxActive="200"

maxIdle="100"

minIdle="2"

maxWait="1000"

validationQuery="q"

testOnBorrow="false"

testOnReturn="true"

testWhileIdle="true"

timeBetweenEvictionRunsMillis="1000"

numTestsPerEvictionRun="2"

minEvictableIdleTimeMillis="18005000"/>

3. 參數說明

名稱 舉例 含義
初始化連接配接數 initialSize="1" 初始化線程數,開始自動建立一個與資料庫的連接配接
最大活動連接配接數 maxActive="200" 可以從對象池中取出的對象最大個數,為0表示沒有限制
最大空閑連接配接數 maxIdle="100" 最大等待連接配接中的數量,設為負數則沒有限制(對象池中對象最大個數)
最小空閑連接配接數 minIdle="2" 對象池中對象最小個數
最大等待時間(毫秒) maxWait="1000" 最大等待時間,機關為ms,超出時間會丢出錯誤資訊
SQL驗證查詢 validationQuery="SQL語句" 驗證連接配接是否成功,SQL和SELECT指令至少要傳回一行
擷取連接配接前檢驗 testOnBorrow="false" 取得對象時是否進行驗證,檢查對象是否有效,預設為false
歸還連接配接前檢驗 testOnReturn="true" 傳回對象時是否進行驗證,檢查對象是否有效,預設為false
開啟空閑回收器檢驗 testWhileIdle="true" 空閑時是否進行驗證,檢查對象是否有效,預設為false
空閑連接配接回收器休眠時間(毫秒) timeBetweenEvictionRunsMillis="1000" 失效檢查線程運作時間間隔,如果小于等于0,不會啟動檢查線程
空閑連接配接回收檢查數 numTestsPerEvictionRun="2" 失效檢查線程運作次數
保持空閑最小時間 minEvictableIdleTimeMillis="18005000" 大于0,進行連接配接空閑時間判斷,或為0,對空閑的連接配接不進行驗證

最大活動連接配接數設定超過資料庫中的連接配接數目,隻能按照資料庫中的連接配接數目為準,如想調至最大,則也要調整資料庫中的連接配接數目,參考文檔連接配接池滿問題中的解決方案。

連接配接池滿問題

1. 問題描述

若日志報ORA-12519 TNS:no appropriate service handler found,是資料庫連接配接失敗的錯誤,12519錯誤是監聽不能提供服務。

2. 原因

原因是我們定義資料連接配接後,點選連接配接時,此時會從用掉一個連接配接池中的一個連接配接。而在定義資料集後,點選預覽按鈕,此時連接配接池就會配置設定連接配接,可能會使用之前那個連接配接(之前的連接配接已釋放),或配置設定一個其他的連接配接或建立一個連接配接。若此時連接配接池所有連接配接都已用完,就會報如下錯誤:

帆軟報表FineReport中資料連接配接的JDBC連接配接池屬性問題

當客戶請求資料庫連接配接時,首先是檢視連接配接池中是否有空閑連接配接(指目前沒有配置設定出去的連接配接)。假如存在空閑連接配接,則把連接配接配置設定給使用者,并作相應的處理(即标記該連接配接為正在使用,引用計數加1)。假如沒有空閑連接配接,則檢視目前所開的連接配接數是不是已經達到maxConn(最大連接配接數),若沒達到就重新建立一個連接配接給請求的客戶;若達到就按設定的maxWaitTime(最大等待時間)進行等待;若等待maxWaitTime後,仍沒有空閑連接配接,就抛出無空閑連接配接的異常給使用者。

3. 解決方案

若您在FineReport連接配接池屬性的設定中,已将最大連接配接數設定得過大,還出現如上的報錯,此時通常就是資料庫程序(processes)達到上限導緻的,可增大資料庫中的連接配接數目來解決此問題。如下在資料庫中修改最大連接配接數:

Select count(*) from v$process檢視目前的連接配接數

Select value from v$parameter where name='processes'檢視資料庫允許的最大連接配接數

Alter system set processes =300 scope = spfile;修改最大連接配接數

重新開機資料庫,再查詢最大連接配接數,數字改變就表示已修改成功。

說明:當客戶釋放資料庫連接配接時,先判定該連接配接的引用次數是否已超過規定值,假如超過就删除該連接配接,并判定目前連接配接池内總的連接配接數是否小于minConn(最小連接配接數),若小于就将連接配接池布滿;假如沒超過就将該連接配接标記為開放狀态,可供再次複用。可看出正是這套政策保證了資料庫連接配接的有效複用,避免頻繁地建立、釋放連接配接所帶來的系統資源開銷。

繼續閱讀