對象復用池()
對象池化是目前非常常用的一種系統優化技術它的核心思想是如果一個類被頻繁請求使用那麼不必每次都生成一個實例可以將這個類的一些實例保存在一個池中待需要使用的時候直接從池中獲取這個池就稱為對象池在實現細節上它可能是一個數組一個鏈表或者任何集合類
對象池的使用非常廣泛其中最為大家所熟悉的就是線程池和數據庫連接池線程池中保存著可以被重用的線程對象當有任務被提交到線程池時系統並不需要新建線程而是從池中獲得一個可用的線程執行這個任務在任務結束後也不關閉線程而將它返回到池中以便下次繼續使用由於線程的創建和銷毀是較為費時的工作因此在線程調度頻繁的系統中線程池可以很好地改善性能有關線程池更詳細的介紹讀者可以參考第章中簡單的線程池實現一節
數據庫連接池也是一種特殊的對象池它用於維護數據庫連接的集合當系統需要訪問數據庫時不需要重新建立數據庫連接而可以直接從池中獲取在數據庫操作完成後也不關閉數據庫連接而是將連接返回到連接池中由於數據庫連接的創建和銷毀是重量級的操作因此避免頻繁進行這兩個操作對改善系統的性能也有積極意義
注意在程序中使用數據庫連接池和線程池可以有效地改善系統在高並發下的性能這是兩個非常重要的性能組件任何對性能敏感的系統都需要考慮合理配置這兩個組件
目前應用較為廣泛的數據庫連接池組件有CP和Proxool其中CP是伴隨著Hibernate一起發布與Hibernate聯系緊密的數據庫連接池本文以CP為例展示數據庫連接池的一般使用方法和特性
若在Hibernate中使用CP連接池只需要將CP的jar包復制到開發環境中並且在hibernatecfgxml中加入以下配置項即可
<property name=connectionprovider_class>orghibernateconnection
CPConnectionProvider</property>
<property name=connectionautoReconnect>true</property>
<property name=connectionautoReconnectForPools>true</property>
<property name=connectionisconnectionvalidationrequired>true
</property>
<! 最大連接數 >
<property name=hibernatecpmax_size></property>
<! 最小連接數 >
<property name=hibernatecpmin_size></property>
<! 獲得連接的超時時間如果超過這個時間會拋出異常單位毫秒 >
<property name=hibernatecptimeout></property>
<! 最大的PreparedStatement的數量 >
<property name=hibernatecpmax_statements></property>
<! 每隔秒檢查連接池裡的空閒連接單位是秒>
<property name=hibernatecpidle_test_period></property>
<! 當連接池裡的連接用完時CP一次性獲取的新的數據庫連接數 >
<property name=hibernatecpacquire_increment></property>
<! 每次都驗證連接是否可用 >
<property name=hibernatecpvalidate>true</property>
當然也可以脫離Hibernate單獨在應用程序中使用CP以下代碼構造了一個CP的數據庫連接池並從中獲得一個數據庫連接
DataSource unpooled = DataSources
unpooledDataSource(
jdbc:mysql://:/test //連接MySQL數據庫
root ) //這個不是連接池
DataSource pooled = DataSourcespooledDataSource(unpooled)
//構建了一個連接池
con = pooledgetConnection() //從連接池中獲取連接
返回目錄Java程序性能優化讓你的Java程序更快更穩定
編輯推薦
Java程序設計培訓視頻教程
JEE高級框架實戰培訓視頻教程
JME移動開發實戰教學視頻
Visual C++音頻/視頻技術開發與實戰
Oracle索引技術
ORACLEG數據庫開發優化指南
From:http://tw.wingwit.com/Article/program/Java/gj/201311/27801.html