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

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>
            久久不射网站| 国产欧美日韩视频在线观看| 久久久久久尹人网香蕉| 亚洲欧洲美洲综合色网| 国产精品永久免费在线| 欧美日韩一区二区在线播放| 欧美成人嫩草网站| 欧美日本在线播放| 欧美日韩xxxxx| 欧美日韩国产在线看| 欧美二区在线播放| 欧美日韩国产欧美日美国产精品| 亚洲人成在线观看| 久久久久一区二区三区| 亚洲视频免费观看| 欧美日韩国产丝袜另类| 欧美激情一区二区久久久| 欧美 日韩 国产一区二区在线视频 | 久久久久久9999| 欧美一区二区三区视频| 性欧美办公室18xxxxhd| 久久综合国产精品台湾中文娱乐网| 久久久精品国产99久久精品芒果| 国产精品久久久久9999吃药| 国产精品高潮呻吟久久| 国产欧美日韩伦理| 正在播放亚洲一区| 欧美日韩第一区日日骚| 欧美高清免费| 亚洲福利一区| 在线观看欧美黄色| 亚洲人在线视频| 亚洲免费影视| 免费观看30秒视频久久| 亚洲精品久久久久久久久| 欧美一区免费视频| 欧美日韩国产综合视频在线| 国产日韩av一区二区| 在线视频观看日韩| 欧美影院在线| 日韩午夜在线电影| 欧美电影美腿模特1979在线看 | 亚洲视频精品在线| 欧美国产91| 久久久久久夜| 国产曰批免费观看久久久| 午夜精品视频一区| 久久精品国产精品 | 欧美激情在线狂野欧美精品| 国产精品卡一卡二卡三| 亚洲一区日韩在线| 一本色道88久久加勒比精品| 欧美一级艳片视频免费观看| 99re66热这里只有精品3直播| 久久精品一区| 国产欧美日韩中文字幕在线| 午夜精品亚洲一区二区三区嫩草| 9色porny自拍视频一区二区| 国产精品99免费看 | 欧美色欧美亚洲高清在线视频| 欧美精品免费在线观看| 亚洲国产精品久久久久秋霞影院| 午夜久久tv| 在线视频你懂得一区二区三区| 欧美中文字幕不卡| 亚洲美女在线观看| 亚洲一区二区3| 伊人精品久久久久7777| 老司机精品福利视频| 美女成人午夜| 亚洲一区国产视频| 久久综合给合| 久久精品成人欧美大片古装| 欧美成年视频| 亚洲欧美日韩国产成人精品影院| 国产日韩欧美一区二区| 久久久激情视频| 精品福利电影| 欧美激情久久久久久| 亚洲视频一区二区免费在线观看| 亚洲一区久久久| 欧美另类videos死尸| 亚洲精品日本| 中日韩视频在线观看| 欧美日本成人| 亚洲高清自拍| 鲁大师成人一区二区三区| 久久精品欧美| 欧美日韩亚洲精品内裤| 久久国产视频网| 99精品免费| 免费美女久久99| 亚洲日本中文字幕| 亚洲欧美日韩天堂一区二区| 老鸭窝毛片一区二区三区| 黄色成人在线网址| 麻豆精品国产91久久久久久| 快射av在线播放一区| 亚洲精品黄网在线观看| 欧美日本国产视频| 在线视频亚洲一区| 老牛影视一区二区三区| 有码中文亚洲精品| 欧美国产精品一区| 一本色道久久88综合日韩精品| 久久五月婷婷丁香社区| 久久麻豆一区二区| 午夜精品福利在线| 欧美成人一区二免费视频软件| 欧美一区三区三区高中清蜜桃| 亚洲高清视频一区| 亚洲第一成人在线| 亚洲高清精品中出| 亚洲国产美女久久久久| 嫩草影视亚洲| 久久久午夜视频| 欧美亚洲综合网| 日韩一级大片在线| 好吊一区二区三区| 狠狠色噜噜狠狠色综合久| 欧美日韩国产三区| 亚洲社区在线观看| 亚洲国产精品一区| 最近中文字幕日韩精品| 91久久久久久久久| 亚洲视频香蕉人妖| 欧美综合国产精品久久丁香| 欧美午夜视频一区二区| 欧美午夜不卡| 亚洲欧美精品中文字幕在线| 欧美国产在线电影| 久久久欧美精品sm网站| 一区二区三区免费观看| 欧美成人四级电影| 欧美~级网站不卡| 亚洲香蕉在线观看| 亚洲午夜羞羞片| 欧美永久精品| 美女诱惑一区| 欧美日本中文| 国产精品午夜在线| 国产私拍一区| 亚洲人成人99网站| 在线视频精品一| 久久久久久自在自线| 欧美日韩精品免费看 | 蜜臀a∨国产成人精品| 一区二区三区四区精品| 99精品国产福利在线观看免费| 欲香欲色天天天综合和网| 亚洲精品在线免费| 亚洲图片在线| 黄色影院成人| 老色鬼久久亚洲一区二区| 欧美精品videossex性护士| 欧美激情一区二区久久久| 国产精品九九久久久久久久| 亚洲日本免费| 一本色道久久综合狠狠躁篇的优点 | 亚洲一区免费| 欧美精品国产一区| 国产精一区二区三区| 国产亚洲一二三区| 亚洲一区二区三区777| 永久91嫩草亚洲精品人人| 亚洲视频一二区| 亚洲视频在线观看免费| 欧美日韩国产bt| 亚洲一区综合| 一级成人国产| 欧美视频在线一区二区三区| 最新国产乱人伦偷精品免费网站| 午夜精品999| 中文在线资源观看视频网站免费不卡| 最新亚洲激情| 亚洲欧美日本国产有色| 亚洲伦理在线免费看| 在线亚洲电影| 国产自产女人91一区在线观看| 久久午夜视频| 久久精品亚洲国产奇米99| 欧美日韩一区二区免费视频| 久久精品国产99精品国产亚洲性色| 欧美一区二区视频97| 亚洲精品免费一二三区| 亚洲欧美日韩在线一区| 伊人影院久久| 亚洲看片免费| 伊人精品在线| 欧美电影电视剧在线观看| 国产精品视频自拍| 亚洲第一精品电影| 国模叶桐国产精品一区| 国产精品theporn88| 欧美1区2区| 国产在线视频欧美| 久久se精品一区二区| 一区二区三区四区精品| 美女图片一区二区| 午夜亚洲性色福利视频|