數據庫連接池概述
數據庫連接是一種關鍵的有限的昂貴的資源這一點在多用戶的網頁應用程序中體現得尤為突出對數據庫連接的管理能顯著影響到整個應用程序的伸縮性和健壯性影響到程序的性能指標數據庫連接池正是針對這個問題提出來的
數據庫連接池負責分配管理和釋放數據庫連接它允許應用程序重復使用一個現有的數據庫連接而再不是重新建立一個釋放空閒時間超過最大空閒時間的數據庫連接來避免因為沒有釋放數據庫連接而引起的數據庫連接遺漏這項技術能明顯提高對數據庫操作的性能
數據庫連接池在初始化時將創建一定數量的數據庫連接放到連接池中這些數據庫連接的數量是由最小數據庫連接數來設定的無論這些數據庫連接是否被使用連接池都將一直保證至少擁有這麼多的連接數量連接池的最大數據庫連接數量限定了這個連接池能占有的最大連接數當應用程序向連接池請求的連接數超過最大連接數量時這些請求將被加入到等待隊列中數據庫連接池的最小連接數和最大連接數的設置要考慮到下列幾個因素
) 最小連接數是連接池一直保持的數據庫連接所以如果應用程序對數據庫連接的使用量不大將會有大量的數據庫連接資源被浪費
) 最大連接數是連接池能申請的最大連接數如果數據庫連接請求超過此數後面的數據庫連接請求將被加入到等待隊列中這會影響之後的數據庫操作
) 如果最小連接數與最大連接數相差太大那麼最先的連接請求將會獲利之後超過最小連接數量的連接請求等價於建立一個新的數據庫連接不過這些大於最小連接數的數據庫連接在使用完不會馬上被釋放它將被放到連接池中等待重復使用或是空閒超時後被釋放
目前常用的連接池有CPDBCPProxool
網上的評價是
CP比較耗費資源效率方面可能要低一點
DBCP在實踐中存在BUG在某些種情會產生很多空連接不能釋放Hibernate已經放棄了對其的支持
Proxool的負面評價較少現在比較推薦它而且它還提供即時監控連接池狀態的功能便於發現連接洩漏的情況
配置如下
在spring配置文件中一般在applicationContextxml中
<bean id=DataSource class=orglogicalcobwebsproxoolProxoolDataSource destroymethod=shutdown>
<property name=driver>
<value>oraclejdbcdriverOracleDriver</value>
</property>
<property name=driverUrl>
<value>jdbc:oracle:thin:xxxx/xxxx@XX::server</value>
</property>
<property name=user>
<value>xxxx</value>
</property>
<property name=password>
<value>xxxx</value>
</property>
<property name=alias>
<value>server</value>
</property>
<property name=houseKeepingSleepTime>
<value></value>
</property>
<property name=houseKeepingTestSql>
<value>select from dual</value>
</property>
<property name=testBeforeUse>
<value>true</value>
</property>
<property name=testAfterUse>
<value>true</value>
</property>
<property name=prototypeCount>
<value></value>
</property>
<property name=maximumConnectionCount>
<value></value>
</property>
<property name=minimumConnectionCount>
<value></value>
</property>
<property name=statistics>
<value>mmd</value>
</property>
<property name=statisticsLogLevel>
<value>ERROR</value>
</property>
<property name=trace>
<value>true</value>
</property>
<property name=verbose>
<value>false</value>
</property>
<property name=simultaneousBuildThrottle>
<value></value>
</property>
<property name=maximumActiveTime>
<value></value>
</property>
<property name=jmx>
<value>false</value>
</property>
</bean>
然後注入到sessionFactory中
<bean id=sessionFactory class=orgspringframeworkormhibernateLocalSessionFactoryBean>
<property name=dataSource ref=DataSource/>
</bean>
屬性列表說明:
fatalsqlexception: 它是一個逗號分割的信息片段當一個SQL異常發生時他的異常信息將與這個信息片段進行比較如果在片段中存在那麼這個異常將被認為是個致命錯誤(Fatal SQL Exception )這種情況下數據庫連接將要被放棄無論發生什麼這個異常將會被重擲以提供給消費者用戶最好自己配置一個不同的異常來拋出
fatalsqlexceptionwrapperclass:正如上面所說你最好配置一個不同的異常來重擲利用這個屬性用戶可以包裝SQLException使他變成另外一個異常這個異常或者繼承QLException或者繼承字RuntimeExceptionproxool自帶了個實現:orglogicalcobwebsproxoolFatalSQLException和orglogicalcobwebsproxoolFatalRuntimeException後者更合適
housekeepingsleeptime: house keeper 保留線程處於睡眠狀態的最長時間house keeper 的職責就是檢查各個連接的狀態並判斷是否需要銷毀或者創建
housekeepingtestsql: 如果發現了空閒的數據庫連接house keeper 將會用這個語句來測試這個語句最好非常快的被執行如果沒有定義測試過程將會被忽略
injectableconnectioninterface: 允許proxool實現被代理的connection對象的方法
injectablestatementinterface: 允許proxool實現被代理的Statement 對象方法
injectablepreparedstatementinterface: 允許proxool實現被代理的PreparedStatement 對象方法
injectablecallablestatementinterface: 允許proxool實現被代理的CallableStatement 對象方法
jmx: 如果屬性為true就會注冊一個消息Bean到jms服務消息Bean對象名: Proxool:type=Pool name=<alias> 默認值為false
jmxagentid: 一個逗號分隔的JMX代理列表(如使用MBeanServerFactoryfindMBeanServer(String agentId)注冊的連接池)這個屬性是僅當jmx屬性設置為true才有效所有注冊jmx服務器使用這個屬性是不確定的
jndiname: 數據源的名稱
maximumactivetime: 如果housekeeper 檢測到某個線程的活動時間大於這個數值它將會殺掉這個線程所以確認一下你的服務器的帶寬然後定一個合適的值默認是分鐘
maximumconnectioncount: 最大的數據庫連接數
maximumconnectionlifetime: 一個線程的最大壽命
minimumconnectioncount: 最小的數據庫連接數
overloadwithoutrefusallifetime: 這可以幫助我們確定連接池的狀態如果我們已經拒絕了一個連接在這個設定值(毫秒)然後被認為是超載默認為秒
prototypecount: 連接池中可用的連接數量如果當前的連接池中的連接少於這個數值新的連接將被建立(假設沒有超過最大可用數)例如我們有個活動連接個可用連接而我們的prototypecount是那麼數據庫連接池將試圖建立另外個連接這和 minimumconnectioncount不同 minimumconnectioncount把活動的連接也計算在內prototypecount 是spare connections 的數量
recentlystartedthreshold: 這可以幫助我們確定連接池的狀態連接數少還是多或超載只要至少有一個連接已開始在此值(毫秒)內或者有一些多余的可用連接那麼我們假設連接池是開啟的默認為秒
simultaneousbuildthrottle: 這是我們可一次建立的最大連接數那就是新增的連接請求但還沒有可供使用的連接由於連接可以使用多線程在有限的時間之間建立聯系從而帶來可用連接但是我們需要通過一些方式確認一些線程並不是立即響應連接請求的默認是
statistics: 連接池使用狀況統計 參數smd
statisticsloglevel: 日志統計跟蹤類型 參數ERROR或 INFO
testbeforeuse: 如果為true在每個連接被測試前都會服務這個連接如果一個連接失敗那麼將被丟棄另一個連接將會被處理如果所有連接都失敗一個新的連接將會被建立否則將會拋出一個SQLException異常
testafteruse: 如果為true在每個連接被測試後都會服務這個連接使其回到連接池中如果連接失敗那麼將被廢棄
trace: 如果為true那麼每個被執行的SQL語句將會在執行期被log記錄(DEBUG LEVEL)你也可以注冊一個ConnectionListener (參看ProxoolFacade)得到這些信息
verbose: 詳細信息設置 參數 bool 值
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28572.html