目前是和DBCP以及c3p0一起,最為常見的三種JDBC連線池技術。
日前,Hibernate官方宣布由於Bug太多不再支持DBCP,而推薦使用 Proxool或C3P0。
Proxool在Hibernate中的典型配置如下:
配置步聚
(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或者以下的版本則沒有.
相關詞條
-
proxool
proxool所屬現代詞,指的是一種Java資料庫連線池技術。
-
ystyle
支持c3p0,proxool,阿里巴巴Druid。DB操作:封裝了...,或從上下文資源動態獲取路徑變數。DB連線:目前支持c3p0,proxool...
簡介 特點 -
java虛擬主機
,Spring,Hibernate, proxool,javamail...,Hibernate, proxool,javamail等),並提供豐富的測試用...
-
JessMA
Druid、Proxool、JNDI等連線池。DAO框架是可擴展的,用戶可以...
基本信息 功能簡介 -
Java Web開發技術詳解
內容簡介《Java Web開發技術詳解》 內容新穎、知識全面、講解詳細,分為3篇,共18章。其中,第1篇是基礎篇,包括第1~4章...
內容簡介 目錄 網站開發非常之旅 -
資料庫連線池
的DataSources 對象。2、Proxool:是一個Java SQL...
背景 影響因素 原理 Java連線池