Proxool 連線池的配置使用

passport_daizi發表於2012-06-05

一.下載proxool
去proxool官網下載proxool,最新版本是0.9.1。

下載完後解壓,把proxool.jar和proxool-cglib.jar放入你要配置的專案的lib目錄下.

二.配置proxool.xml
新增proxool.xml檔案到專案的/WEB-INF下.
連線資料庫Oracle的配置如下:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!-- the proxool configuration can be embedded within your own application's.
Anything outside the "proxool" tag is ignored. -->
<something-else-entirely>
<proxool>
    <alias>dbname</alias>
    <driver-url>jdbc:oracle:thin:@127.0.0.1:1521:testdb</driver-url>
    <driver-class>oracle.jdbc.driver.OracleDriver</driver-class>
    <driver-properties>
      <property name="user" value="username"/>
      <property name="password" value="password"/>
    </driver-properties>
    <maximum-connection-count>100</maximum-connection-count>
    <minimum-connection-count>10</minimum-connection-count>
    <house-keeping-sleep-time>90000</house-keeping-sleep-time>
    <maximum-new-connections>10</maximum-new-connections>
    <prototype-count>5</prototype-count>
    <test-before-use>true</test-before-use>
    <house-keeping-test-sql>select 1 from dual</house-keeping-test-sql>
</proxool>
</something-else-entirely>

alias:資料來源的別名
driver-url:url連線串,須確定使用者名稱和密碼
driver-class:驅動名
username:使用者名稱(proxool沒有使用,但是不能沒有)
password:密碼(proxool沒有使用,但是不能沒有)
maximum-connection-count:最大連線數(預設5個),超過了這個連線數,再有請求時,就排在佇列中等候,最大的等待請求數由maximum-new-connections決定
minimum-connection-count:最小連線數(預設2個)
house-keeping-sleep-time:proxool自動偵察各個連線狀態的時間間隔(毫秒),偵察到空閒的連線就馬上回收,超時的銷燬 預設30秒)
prototype-count:最少保持的空閒連線數(預設2個)
maximum-new-connections:沒有空閒連線可以分配而在佇列中等候的最大請求數,超過這個請求數的使用者連線就不會被接受
test-before-use和house-keeping-test-sql:測試用

三.配置web.xml

<servlet>
<servlet-name>contextConfigLocation</servlet-name>
<servlet-class>
    org.springframework.web.context.ContextLoaderServlet
</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>

<servlet>
<servlet-name>ServletConfigurator</servlet-name>
<servlet-class>
    org.logicalcobwebs.proxool.configuration.ServletConfigurator
</servlet-class>
<init-param>
    <param-name>xmlFile</param-name>
    <param-value>WEB-INF/proxool.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>

<servlet>
<servlet-name>123</servlet-name>
<servlet-class>
    org.logicalcobwebs.proxool.123.servlet.123Servlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>123</servlet-name>
<url-pattern>/123</url-pattern>
</servlet-mapping>

ServletConfigurator:載入並初始化proxool.xml檔案,因為它是連線資料庫的.其他很多模組都用到資料,所以必須首先載入它
load-on-startup:值越小級別就越高,就先被載入初始化
contextConfigLocation:載入Spring的配置檔案,如果以前是:

<listener>
<listener-class>
    org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
則必須改成

<servlet>
<servlet-name>contextConfigLocation</servlet-name>
<servlet-class>
    org.springframework.web.context.ContextLoaderServlet
</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>

設定載入順序為proxool.xml之後,如果設定成監聽器的形式,因監聽器會在servlet之前載入,所以會報錯.
123:監控資料庫連線池的連線情況

四.配置applicationContext.xml,整合Spring和proxool

<bean id="dataSource"
    class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName"
        value="org.logicalcobwebs.proxool.ProxoolDriver" />
    <property name="url" value="proxool.dbname" />
</bean>


<property name="url">要配置成 proxool. + proxool.xml中的別名

配置基本完成,還有其它配置方式,但個人比較喜好這種.

另附加一份proxool.xml的配置屬性說明:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!--
Properties for Proxool Configurator testing. Defines the same parameters as
TestHelper.buildCompleteAlternativeProperties()
-->
<something-else-entirely xmlns="http://sumthin.else.entirely" xmlns:proxool="The latest version is available at http://proxool.sourceforge.net/xml-namespace">
    <proxool:proxool>
        <proxool:alias>xml-test-ns</proxool:alias>
        <proxool:driver-url>jdbc:hsqldb:db/test</proxool:driver-url>
        <proxool:driver-class>org.hsqldb.jdbcDriver</proxool:driver-class>
        <proxool:driver-properties>
            <proxool:property name="user" value="sa"/>
            <proxool:property name="password" value=""/>
        </proxool:driver-properties>
        <proxool:house-keeping-sleep-time>40000</proxool:house-keeping-sleep-time>
        <proxool:house-keeping-test-sql>select CURRENT_DATE</proxool:house-keeping-test-sql>
        <proxool:maximum-connection-count>10</proxool:maximum-connection-count>
        <proxool:minimum-connection-count>3</proxool:minimum-connection-count>
        <proxool:maximum-connection-lifetime>18000000</proxool:maximum-connection-lifetime> <!-- 5 hours -->
        <proxool:simultaneous-build-throttle>5</proxool:simultaneous-build-throttle>
        <proxool:recently-started-threshold>40000</proxool:recently-started-threshold>
        <proxool:overload-without-refusal-lifetime>50000</proxool:overload-without-refusal-lifetime>
        <proxool:maximum-active-time>60000</proxool:maximum-active-time>
        <proxool:verbose>true</proxool:verbose>
        <proxool:trace>true</proxool:trace>
        <proxool:fatal-sql-exception>Fatal error</proxool:fatal-sql-exception>
        <proxool:prototype-count>2</proxool:prototype-count>
    </proxool:proxool>
    <nothing-to-do-with-proxool>
        <proxool:proxool>
            <proxool:alias>xml-test-ns-2</proxool:alias>
            <proxool:driver-url>jdbc:hsqldb:db/test</proxool:driver-url>
            <proxool:driver-class>org.hsqldb.jdbcDriver</proxool:driver-class>
            <proxool:driver-properties>
                <proxool:property name="user" value="sa"/>
                <proxool:property name="password" value=""/>
            </proxool:driver-properties>
            <proxool:house-keeping-sleep-time>40000</proxool:house-keeping-sleep-time>
            <proxool:house-keeping-test-sql>select CURRENT_DATE</proxool:house-keeping-test-sql>
            <proxool:maximum-connection-count>10</proxool:maximum-connection-count>
            <proxool:minimum-connection-count>3</proxool:minimum-connection-count>
            <proxool:maximum-connection-lifetime>18000000</proxool:maximum-connection-lifetime> <!-- 5 hours -->
            <proxool:simultaneous-build-throttle>5</proxool:simultaneous-build-throttle>
            <proxool:recently-started-threshold>40000</proxool:recently-started-threshold>
            <proxool:overload-without-refusal-lifetime>50000</proxool:overload-without-refusal-lifetime>
            <proxool:maximum-active-time>60000</proxool:maximum-active-time>
            <proxool:verbose>true</proxool:verbose>
            <proxool:trace>true</proxool:trace>
            <proxool:fatal-sql-exception>Fatal error</proxool:fatal-sql-exception>
            <proxool:prototype-count>2</proxool:prototype-count>
        </proxool:proxool>
    </nothing-to-do-with-proxool>
</something-else-entirely>

屬性列表說明:

fatal-sql-exception: 它是一個逗號分割的資訊片段.當一個SQL異常發生時,他的異常資訊將與這個資訊片段進行比較.如果在片段中存在,那麼這個異常將被認為是個致命錯誤(Fatal SQL Exception ).這種情況下,資料庫連線將要被放棄.無論發生什麼,這個異常將會被重擲以提供給消費者.使用者最好自己配置一個不同的異常來丟擲.

fatal-sql-exception-wrapper-class:正如上面所說,你最好配置一個不同的異常來重擲.利用這個屬性,使用者可以包裝SQLException,使他變成另外一個異常.這個異常或者繼承SQLException或者繼承字RuntimeException.proxool自帶了2個實現:'org.logicalcobwebs.proxool.FatalSQLException' 和'org.logicalcobwebs.proxool.FatalRuntimeException' .後者更合適.

house-keeping-sleep-time: house keeper 保留執行緒處於睡眠狀態的最長時間,house keeper 的職責就是檢查各個連線的狀態,並判斷是否需要銷燬或者建立.

house-keeping-test-sql: 如果發現了空閒的資料庫連線.house keeper 將會用這個語句來測試.這個語句最好非常快的被執行.如果沒有定義,測試過程將會被忽略。

injectable-connection-interface: 允許proxool實現被代理的connection物件的方法.

injectable-statement-interface: 允許proxool實現被代理的Statement 物件方法.

injectable-prepared-statement-interface: 允許proxool實現被代理的PreparedStatement 物件方法.

injectable-callable-statement-interface: 允許proxool實現被代理的CallableStatement 物件方法.

jmx: 如果屬性為true,就會註冊一個訊息Bean到jms服務,訊息Bean物件名: "Proxool:type=Pool, name=<alias>". 預設值為false.


jmx-agent-id: : 一個逗號分隔的JMX代理列表(如使用MBeanServerFactory.findMBeanServer(String agentId)註冊的連線池。)這個屬性是僅當"jmx"屬性設定為"true"才有效。所有註冊jmx伺服器使用這個屬性是不確定的


jndi-name: 資料來源的名稱

maximum-active-time: 如果housekeeper 檢測到某個執行緒的活動時間大於這個數值.它將會殺掉這個執行緒.所以確認一下你的伺服器的頻寬.然後定一個合適的值.預設是5分鐘.

maximum-connection-count: 最大的資料庫連線數.

maximum-connection-lifetime: 一個執行緒的最大壽命.

minimum-connection-count: 最小的資料庫連線數

overload-without-refusal-lifetime: 這可以幫助我們確定連線池的狀態。如果我們已經拒絕了一個連線在這個設定值

(毫秒),然後被認為是超載。預設為60秒。

prototype-count: 連線池中可用的連線數量.如果當前的連線池中的連線少於這個數值.新的連線將被建立(假設沒有超過最大可用數).例如.我們有3個活動連線2個可用連線,而我們的prototype-count是4,那麼資料庫連線池將試圖建立另外2個連線.這和 minimum-connection-count不同. minimum-connection-count把活動的連線也計算在內.prototype-count 是spare connections 的數量.

recently-started-threshold: 這可以幫助我們確定連線池的狀態,連線數少還是多或超載。只要至少有一個連線

已開始在此值(毫秒)內,或者有一些多餘的可用連線,那麼我們假設連線池是開啟的。預設為60秒


simultaneous-build-throttle: 這是我們可一次建立的最大連線數。那就是新增的連線請求,但還沒有可供使用的連線。由於

連線可以使用多執行緒,在有限的時間之間建立聯絡從而帶來可用連線,但是我們需要通過一些方式確認一些執行緒並不是立即響應

連線請求的,預設是10。

statistics: 連線池使用狀況統計。 引數“10s,1m,1d”

statistics-log-level: 日誌統計跟蹤型別。 引數“ERROR”或 “INFO”

test-before-use:

test-after-use:

trace: 如果為true,那麼每個被執行的SQL語句將會在執行期被log記錄(DEBUG LEVEL).你也可以註冊一個ConnectionListener (參看ProxoolFacade)得到這些資訊.

verbose: 詳細資訊設定。 引數 bool 值


相關文章