青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 311, comments - 0, trackbacks - 0, articles - 0
  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

(搬運工)對象池技術

Posted on 2011-04-29 14:39 點點滴滴 閱讀(638) 評論(0)  編輯 收藏 引用

1 對象池技術的原理:

    對象池技術在服務器開發上應用廣泛。在各種對象池的實現中,尤其以數據庫的連接池最為明顯,可以說是每個服務器必須實現的部分。本文是個人學習對象池的一個記錄,以Apache的commons-pool實現為研究對象。在第二部分中,本人將繼續研究Apache的common-dbcp,這是對象池技術在JDBC上的一個應用范例。
    ObjectPool維護一個列表,其中存放所有已經生成的對象。同時導出幾個方法,如 borrowObject,returnObject,addObject等等。當用戶調用borrowObject時,ObjectPool查看當前列表中的空閑對象的數目,如果有空閑的對象,則初始化該對象后返回給用戶,否則創建一個對象,返回給用戶使用。同理,當用戶調用returnObject 時,ObjectPool查看當前隊列中的空閑對象數目,如果數目小于DEFAULT_MAX_SLEEPING,則將改對象的狀態清空,然后放到隊列中,作為備用對象;否則直接銷毀該對象。
    對象池中還涉及到一些高級的技術, 比如過期銷毀, 被破壞時銷毀, 對象數超過池大小銷毀, 對象池中沒有可用空閑對象時等待等等.
apache的common-pool工具庫是對池化技術原理的一種具體實現. 在闡述原理之前, 這里先理解幾個概念:
對象池(ObjectPool接口): 可以把它認為是一種容器, 它是用來裝池對象的, 并且包含了用來創建池對象的工廠對象
池對象:就是要放到池容器中的對象, 理論上可以是任何對象.
對象池工廠(ObjectPoolFactory接口):用來創建對象池的工廠, 這個沒什么好說的.
池對象工廠(PoolableObjectFactory 接口):用來創建池對象, 將不用的池對象進行鈍化(passivateObject), 對要使用的池對象進行激活(activeObject), 對池對象進行驗證(validateObject), 對有問題的池對象進行銷毀(destroyObject)等工作
    對象池中封裝了創建, 獲取, 歸還, 銷毀池對象的職責, 當然這些工作都是通過池對象工廠來實施的, 容器內部還有一個或多個用來盛池對象的容器.對象池會對容器大小, 存放時間, 訪問等待時間, 空閑時間等等進行一些控制, 因為可以根據需要來調整這些設置.
    當需要拿一個池對象的時候, 就從容器中取出一個, 如果容器中沒有的話, 而且又沒有達到容器的最大限制, 那么就調用池對象工廠, 新建一個池對象, 并調用工廠的激活方法, 對創建的對象進行激活, 驗證等一系列操作. 如果已經達到池容器的最大值, 而對象池中又經沒有空閑的對象, 那么將會繼續等待, 直到有新的空閑的對象被丟進來, 當然這個等待也是有限度的, 如果超出了這個限度, 對象池就會拋出異常.
    “出來混, 總是要還的”, 池對象也是如此, 當將用完的池對象歸還到對象池中的時候, 對象池會調用池對象工廠對該池對象進行驗證, 如果驗證不通過則被認為是有問題的對象, 將會被銷毀, 同樣如果容器已經滿了, 這個歸還池對象將變的”無家可歸”, 也會被銷毀, 如果不屬于上面兩種情況, 對象池就會調用工廠對象將其鈍化并放入容器中. 在整個過程中, 激活, 檢查, 鈍化處理都不是必須的, 因此我們在實PoolableObjectFactory接口的時候, 一般不作處理, 給空實現即可, 所以誕生了BasePoolableObjectFactory.
    當然你也可以將要已有的對象創建好, 然后通過addObject放到對象池中去, 以備后用.
    為了確保對對象池的訪問都是線程安全的, 所有對容器的操作都必須放在synchronized中.
    這種備用的觀念正是對象池的理論基礎,可以很大程度上減少對象生成和銷毀的次數。對于那些初始化過程很慢的對象來說,減少對象構造和銷毀的次數就等于大幅度提高了整體效率。特別是對于數據庫連接這樣的對象,由于進行JNDI搜索的效率極為低下,應用對象池技術是理所當然的。
    需要注意的是,對象池技術并不是對任何對象都適用。因為對象池本身的操作要耗費一些資源,對于一些小對象來說,使用對象池可能取得相反的效果。IBM DeveloperWorks上有一篇論文,指出簡單對象如Point,Size等,使用對象池技術并不能帶來性能的改善;而復雜對象如 JPanel,JFrame等,使用對象池后能帶來稍微的性能優勢;最最適合對象池技術的是一些耗時操作,如JDBC連接,線程等。 

2 研究 Apache common pool  

   對象池結構: 

   在 apache的common-pool工具庫中有5種對象池:GenericObjectPool和 GenericKeyedObjectPool, SoftReferenceObjectPool, StackObjectPool, StackKeyedObjectPool.
   五種對象池可分為兩類, 一類是無key的(有key的類圖相似):
   
    前面兩種用CursorableLinkedList來做容器
    SoftReferenceObjectPool用ArrayList做容器, 一次性創建所有池化對象, 并對容器中的對象進行了軟引用(SoftReference)處理, 從而保證在內存充足的時候池對象不會輕易被jvm垃圾回收, 從而具有很強的緩存能力.
    最后兩種用Stack做容器. 不帶key的對象池是對前面池技術原理的一種簡單實現, 帶key的相對復雜一些, 它會將池對象按照key來進行分類, 具有相同的key被劃分到一組類別中, 因此有多少個key, 就會有多少個容器. 之所以需要帶key的這種對象池, 是因為普通的對象池通過makeObject()方法創建的對象基本上都是一模一樣的, 因為沒法傳遞參數來對池對象進行定制. 
    因此四種池對象的區別主要體現在內部的容器的區別, Stack遵循”后進先出”的原則并能保證線程安全, CursorableLinkedList是一個內部用游標(cursor)來定位當前元素的雙向鏈表, 是非線程安全的, 但是能滿足對容器的并發修改.ArrayList是非線程安全的, 便利方便的容器.
    
    使用對象池的一般步驟:創建一個池對象工廠, 將該工廠注入到對象池中, 當要取池對象, 調用borrowObject, 當要歸還池對象時, 調用returnObject, 銷毀池對象調用clear(), 如果要連池對象工廠也一起銷毀, 則調用close().
下面是一些時序圖:






common-dbcp的結構
    apache的連接池工具庫common-dbcp是common-pool在數據庫訪問方面的一個具體應用.當對common-pool熟悉之后, 對common-dbcp就很好理解了. 它通過對已有的Connection, Statment對象包裝成池對象PoolableConnection, PoolablePreparedStatement. 然后在這些池化的對象中, 持有一個對對象池的引用, 在關閉的時候, 不進行真正的關閉處理, 而是通過調用:
1. _pool.returnObject(this); 
或:
1. _pool.returnObject(_key,this); 
這樣一句, 將連接對象放回連接池中.
而對應的對象池前者采用的是ObjectPool, 后者是KeyedObjectPool, 因為一個數據庫只對應一個連接, 而執行操作的Statement卻根據Sql的不同會分很多種. 因此需要根據sql語句的不同多次進行緩存
在對連接池的管理上, common-dbcp主要采用兩種對象:
一個是PoolingDriver, 另一個是PoolingDataSource, 二者的區別是PoolingDriver是一個更底層的操作類, 它持有一個連接池映射列表, 一般針對在一個jvm中要連接多個數據庫, 而后者相對簡單一些. 內部只能持有一個連接池, 即一個數據源對應一個連接池.
下面是common-dbcp的結構關系:


下面是參考了common-dbcp的例子之后寫的一個從連接池中獲取連接的工具類

1. /**
2. * 創建連接
3. *
4. * @since 2009-1-22 下午02:58:35
5. */
6. public class ConnectionUtils {
7. // 一些common-dbcp內部定義的protocol
8. private static final String POOL_DRIVER_KEY = "jdbc:apache:commons:dbcp:";
9. private static final String POLLING_DRIVER = "org.apache.commons.dbcp.PoolingDriver";
10.
11. /**
12. * 取得池化驅動器
13. *
14. * @return
15. * @throws ClassNotFoundException
16. * @throws SQLException
17. */
18. private static PoolingDriver getPoolDriver() throws ClassNotFoundException,
19. SQLException {
20. Class.forName(POLLING_DRIVER);
21. return (PoolingDriver) DriverManager.getDriver(POOL_DRIVER_KEY);
22. }
23.
24. /**
25. * 銷毀所有連接
26. *
27. * @throws Exception
28. */
29. public static void destory() throws Exception {
30. PoolingDriver driver = getPoolDriver();
31. String[] names = driver.getPoolNames();
32. for (String name : names) {
33. driver.getConnectionPool(name).close();
34. }
35. }
36.
37. /**
38. * 從連接池中獲取數據庫連接
39. */
40. public static Connection getConnection(TableMetaData table)
41. throws Exception {
42. String key = table.getConnectionKey();
43.
44. PoolingDriver driver = getPoolDriver();
45.
46. ObjectPool pool = null;
47. // 這里找不到連接池會拋異常, 需要catch一下
48. try {
49. pool = driver.getConnectionPool(key);
50. } catch (Exception e) {
51. }
52.
53. if (pool == null) {
54. // 根據數據庫類型構建連接工廠
55. ConnectionFactory connectionFactory = null;
56. if (table.getDbAddr() != null
57. && TableMetaData.DB_TYPE_MYSQL == table.getDbType()) {
58. Class.forName(TableMetaData.MYSQL_DRIVER);
59. connectionFactory = new DriverManagerConnectionFactory(table
60. .getDBUrl(), null);
61. } else {
62. Class.forName(TableMetaData.ORACLE_DRIVER);
63. connectionFactory = new DriverManagerConnectionFactory(table
64. .getDBUrl(), table.getDbuser(), table.getDbpass());
65. }
66.
67. // 構造連接池
68. ObjectPool connectionPool = new GenericObjectPool(null);
69. new PoolableConnectionFactory(connectionFactory, connectionPool,
70. null, null, false, true);
71.
72. // 將連接池注冊到driver中
73. driver.registerPool(key, connectionPool);
74. }
75.
76. // 從連接池中拿一個連接
77. return DriverManager.getConnection(POOL_DRIVER_KEY + key);
78. }
79.
80. }


雖然對象池技術在實際開發過程中用的不是很多, 但是理解之后對我們寫程序還是有莫大的好處的, 至少我是這樣的

3 用法:

     dbcp([url]http://jakarta.apache.org/commons/dbcp/[/url])這個apache的開源的數據庫連接池。結果發現dbcp依賴Apache common pool([url]http://jakarta.apache.org/commons/pool/[/url]


關于對象池更多具體用法:

[url]http://www.ibm.com/developerworks/cn/java/l-common-pool/index.html#4[/url]

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国模吧视频一区| 欧美综合国产| 亚洲一区黄色| 亚洲大片精品永久免费| 亚洲深爱激情| 女人香蕉久久**毛片精品| 亚洲国产天堂久久综合| 久久亚洲春色中文字幕| 亚洲欧美中文日韩v在线观看| 欧美亚州在线观看| 午夜宅男欧美| 亚洲欧美日韩区| 国产精品乱子乱xxxx| 亚洲一区二区三区在线| 国产亚洲人成a一在线v站| 一区二区日韩精品| 欧美在线一区二区| 在线观看一区二区精品视频| 午夜视频久久久| 91久久国产精品91久久性色| 久久午夜精品| 日韩视频不卡| 亚洲三级视频| 国产精品久久久免费| 午夜一区二区三视频在线观看| 西西人体一区二区| 亚洲人成77777在线观看网| 亚洲激情校园春色| 国产精品欧美一区二区三区奶水| 亚洲日本成人| 亚洲二区免费| 一区二区三区视频在线观看| 欧美国产亚洲视频| 久久精品99国产精品日本| 欧美成人xxx| 99国产精品久久久久久久| 亚洲欧美国内爽妇网| 国产日韩欧美高清免费| 欧美国产日韩二区| 国产精品一区免费观看| 欧美激情免费观看| 国产精品高潮呻吟久久| 久久国产精品久久国产精品| 麻豆精品国产91久久久久久| 午夜精品在线看| 欧美成年人视频| 久久综合导航| 国产人成一区二区三区影院| 亚洲国产一区二区在线| 国产一区二区三区奇米久涩| 欧美午夜精品久久久久久久 | 亚洲国产美女久久久久| 久久噜噜亚洲综合| 久久一二三四| 影院欧美亚洲| 欧美一区二区在线| 亚洲欧美在线高清| 日韩亚洲不卡在线| 欧美日韩在线精品| 在线一区二区三区四区| 亚洲影院高清在线| 国产一区二区久久| 久久午夜精品| 麻豆视频一区二区| 亚洲美女尤物影院| 欧美一区二区在线免费播放| 99re亚洲国产精品| 国产精品大片| 久久亚洲国产精品日日av夜夜| 欧美国产激情| 亚洲欧洲av一区二区| 先锋影音久久| 亚洲国产欧美日韩| 久久一区欧美| 久久精品日韩欧美| 欧美一二三区精品| 亚洲毛片av在线| 国产亚洲福利社区一区| 国产精品久久77777| 欧美性感一类影片在线播放 | 在线观看日韩一区| 国产一区二区高清视频| 国产亚洲精品综合一区91| 亚洲每日在线| 久久精品国产在热久久| 欧美精品一区在线播放| 欧美一区二区三区日韩视频| 欧美人成网站| 日韩一级在线| 亚洲一区二区久久| 在线免费观看视频一区| 久久在线免费观看| 91久久精品国产91性色| 免费欧美日韩国产三级电影| 久久久久成人网| 欧美成人国产| 亚洲日韩欧美视频一区| 免费观看在线综合| 久久久久综合网| 欧美成年人视频网站| 亚洲日本va午夜在线影院| 亚洲永久免费| 欧美国内亚洲| 国产欧美一区二区精品性色| 国产一区二区三区观看| 亚洲精品乱码久久久久久按摩观 | 男女精品网站| 欧美激情视频一区二区三区不卡| 亚洲精品乱码视频| 久久久久国产精品厨房| 国产精品国产三级国产普通话蜜臀 | 亚洲中字黄色| 欧美福利视频在线观看| 欧美大片免费久久精品三p | 久久噜噜噜精品国产亚洲综合| 欧美天堂亚洲电影院在线播放| 最新亚洲视频| 亚洲精品久久嫩草网站秘色| 亚洲视频999| 欧美aa国产视频| 尤物九九久久国产精品的分类| 亚洲午夜日本在线观看| 最新国产精品拍自在线播放| 久久久噜噜噜| 国产精品久久久久影院亚瑟| 韩日精品在线| 亚欧成人在线| 亚洲理论在线| 欧美日本视频在线| 亚洲一区二区少妇| 欧美多人爱爱视频网站| 性欧美8khd高清极品| 欧美午夜视频在线观看| 亚洲综合色丁香婷婷六月图片| 91久久极品少妇xxxxⅹ软件| 久久国产视频网站| 欧美韩日一区| 亚洲精品视频啊美女在线直播| 亚洲电影中文字幕| 欧美日韩国产一级| 久久久国产一区二区| 久久一区激情| 国产一区二区日韩精品| 久久亚洲国产成人| 久久成人免费视频| 亚洲黄色精品| 欧美一区二粉嫩精品国产一线天| 在线观看av不卡| 亚洲激情视频网站| 国产精品久久久久久久久久久久久久 | 国产精品乱码久久久久久| 免费成人高清| 欧美午夜寂寞影院| 久久久免费观看视频| 久久不射中文字幕| 亚洲午夜免费视频| 亚洲一区久久久| 欧美一区二区在线看| 日韩香蕉视频| 蜜桃精品久久久久久久免费影院| 欧美一区二区视频网站| 国产精品久久福利| 免费成人高清视频| 国产精品美女久久久免费 | 亚洲女人av| 欧美剧在线观看| 亚洲国产日韩欧美综合久久| 国内精品视频在线播放| 在线一区二区视频| 亚洲摸下面视频| 国产精品一级二级三级| 亚洲在线观看视频网站| 国产日韩欧美二区| 欧美亚洲一区二区在线| 久久久综合网| 亚洲国产精品一区二区第一页| 一区二区三区精品在线| 亚洲国产成人久久综合| 亚洲欧美精品| 久久一区精品| 91久久在线视频| 国产精品欧美风情| 久久综合九色综合欧美就去吻| 亚洲第一区在线观看| 亚洲美女免费精品视频在线观看| 欧美—级高清免费播放| 日韩视频免费| 久久免费视频在线| 在线看片欧美| 欧美另类videos死尸| 亚洲欧美日韩精品在线| 欧美xart系列高清| 99精品视频免费观看视频| 欧美色欧美亚洲另类七区| 亚洲图片欧美一区| 亚洲人成啪啪网站| 久久综合九色综合网站 | 国产欧美一区二区精品性色| 久久久亚洲综合| av成人福利|