public static Object getInnter(Object con){
Object re=null;
Field f;
try {
f = congetClass()getDeclaredField(inner)
fsetAccessible(true)
re= fget(con) //取得內部包裝的Connection
fsetAccessible(false)
} catch Exception e) {
}
return re;
}
以上代碼運行後輸出
con Class Type is:commchangevcpimplNewProxyConnection
Inner con Class Type is:commysqljdbcJDBCConnection
Data from DB:
o and o is same object
Data from DB:
上述代碼中首先從數據庫連接池獲得一個連接發現連接類型並不是mysql的數據庫連接而是commchangevcpimplNewProxyConnection根據類名中可以推測從數據庫連接池中獲得的連接只是一個代理接著通過反射取得這個對象中名為inner的屬性並打印其Class類型發現這才是真正的mysql連接關閉NewProxyConnection連接再向池中請求一個新的連接同樣獲取該連接內部的實際數據庫連接對象發現第一次使用的實際數據庫連接對象o和第二次使用的對象o是完全相同的
這說明前後兩次數據庫連接的請求均返回了相同的數據庫連接關閉NewProxyConnection連接時並沒有真正關閉數據庫連接而只是將數據庫連接放入連接池保存使得數據庫連接在連接池中得到了復用而從連接池返回的NewProxyConnection對象只是對真實數據庫連接的包裝
除了線程池和數據庫連接池對於普通的Java對象在必要的時候也可以進行池化管理對於那些經常使用並且創建很費時的大型對象來說使用對象池維護不僅可以節省獲得對象實例的成本還可以減輕GC頻繁回收這些對象產生的系統壓力但對於生成對象開銷很小的對象進行池化反而可能得不償失維護對象池的成本可能會大於對象池帶來的好處
注意在JDK中new操作的效率是相當高的不需要擔心頻繁的new操作對系統有性能影響但是new操作時所調用的類構造函數可能是非常費時的對於這些對象可以考慮池化
返回目錄Java程序性能優化讓你的Java程序更快更穩定
編輯推薦
Java程序設計培訓視頻教程
JEE高級框架實戰培訓視頻教程
JME移動開發實戰教學視頻
Visual C++音頻/視頻技術開發與實戰
Oracle索引技術
ORACLEG數據庫開發優化指南
[] []
From:http://tw.wingwit.com/Article/program/Java/gj/201311/27800.html