搞了一天的在hibernate中配置proxool,終於算是調通過了,其中遇到了許多問題,在這裏和大家分享一下.
1.官網下載地址:
http://sourceforge.net/projects/proxool/files/
2.說明一下我的配置環境
JRE1.6, tomcat6.0,hibernate3.1, proxool-0.9.0RC3
數據庫爲MSSQL2005 JDBC驅動爲sqljdbc.jar
3.配置步聚
(1) 建立proxool.xml文件,路徑爲根目錄src下即與hibernate.cfg.xml同目錄,內容如下:
<?xml version="1.0" encoding="UTF-8"?>
<!--
the proxool configuration can be embedded within your own application's.
Anything outside the "proxool" tag is ignored.
-->
<something-else-entirely>
<proxool>
<alias>mssqlProxool</alias>
<driver-url>jdbc:sqlserver://XXX.XXX.XXX.XX:1433;databaseName=XXX</driver-url>
<driver-class>com.microsoft.sqlserver.jdbc.SQLServerDriver</driver-class>
<driver-properties>
<property name="user" value="sa" />
<property name="password" value="XXX" />
</driver-properties>
<house-keeping-test-sql>select CURRENT_DATE</house-keeping-test-sql>
<house-keeping-sleep-time>90000</house-keeping-sleep-time>
<simultaneous-build-throttle>20</simultaneous-build-throttle>
<maximum-connection-count>100</maximum-connection-count>
<minimum-connection-count>10</minimum-connection-count>
<maximum-connection-lifetime>3600000</maximum-connection-lifetime>
</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: 如果爲true,在每個連接被測試前都會服務這個連接,如果一個連接失敗,那麼將被丟棄,另一個連接將會被處理,如果所有連接都失敗,一個新的連接將會被建立。否則將會拋出一個SQLException異常。
test-after-use: 如果爲true,在每個連接被測試後都會服務這個連接,使其回到連接池中,如果連接失敗,那麼將被廢棄。
trace: 如果爲true,那麼每個被執行的SQL語句將會在執行期被log記錄(DEBUG LEVEL).你也可以註冊一個ConnectionListener (參看ProxoolFacade)得到這些信息.
(2)修改hibernate.cfg.xml文件,內容如下:
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<!-- Generated by MyEclipse Hibernate Tools. -->
<hibernate-configuration>
<session-factory>
<property name="hibernate.proxool.pool_alias">mssqlProxool</property>
<property name="hibernate.proxool.xml">proxool.xml</property>
<property name="hibernate.connection.provider_class">org.hibernate.connection.ProxoolConnectionProvider</property>
<property name="hibernate.proxool.existing_pool">true</property>
<property name="dialect">org.hibernate.dialect.SQLServerDialect</property>
<property name="hibernate.cache.use_query_cache">true</property>
</session-factory>
</hibernate-configuration>
這裏需注意三點:
1.別名與proxool中的別名保持一致.
2.路徑確保正確
3一般網上只說明了以上兩點,hibernate.proxool.existing_pool 這個參數很重要
hibernate.proxool.existing_pool:此值設爲 false,當 hibernate 開始被調用時,就會初始化 proxool,進行數據庫連接等操作;
(3)要讓程序直接使用proxool連接池,可以在web.xml中配置初始化servlet,在web容器加載的時候自動加載配置文件
<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/classes/proxool.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
注意:如果同時配置了web.xml和hibernate.cfg.xml會產生錯誤:
org.logicalcobwebs.proxool.ProxoolException: Parsing failed.
因爲同名的proxool連接池已經啓動,而hibernate開始運行時會自己啓動關聯的proxool連接池.
所以此時應改變hibernate.cfg.xml配置爲:
< property name = "hibernate.proxool.existing_pool" > true </ property >
(4)這一步是可選的 在應用中實時監控連接池
<servlet>
<servlet-name>adminProxool</servlet-name>
<servlet-class>org.logicalcobwebs.proxool.admin.servlet.AdminServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>adminProxool</servlet-name>
<url-pattern>/admin/proxool</url-pattern>
</servlet-mapping>
訪問http://localhost:8080/項目名稱/admin/proxool即可看到頁面
4.錯誤解析:
常遇到的問題是
org.hibernate.HibernateException:Proxool Provider unable to load JAXP configurator file:proxool.xml
這有可能是由於proxool包版本的問題,我先後試過proxool-0.9.0RC1 proxool-0.9.0RC2 proxool-0.9.0RC3
proxool-0.9.0 proxool-0.9.1 結果是高版本的0.9.0和0.9.1都會有這個問題,使用RC1或者以下的版本則沒有.
希望以上的解說寫成word文檔提供下載,希望能給準備使用proxool的朋友以幫助.