<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆 - 1, 文章 - 0, 評論 - 5, 引用 - 0
    數據加載中……

    Java對象池的簡單應用

    Apache 的commons pool框架為我們提供了對象池封裝技術,也就是大家說的緩存技術,個人感覺還是不錯的。

    以下是一個簡單的例子,希望能夠起到拋磚引玉的作用,當然如果要應用到實際項目中的話,還需要完善很多內容,比如對象池的參數配置、日志處理、異常解決。。。

    需要緩存的對象:
    public class Employee {
          
    static int counter=0;
          
    private String name;
          
    private int id;

          
    public Employee(String name) {
            
    this.name=name;
            
    this.id=++counter;
            System.out.println(name
    +" is created!");
          }


          
    public String getName() {
            
    return this.name;
          }


          
    public void setName(String name) {
            
    this.name = name;
          }


          
    public void doWork() {
            System.out.println(
    this.toString()+" do some thing");
          }


          
    public String toString() {
            
    return (" Name: " + this.name+",id:"+this.id);
          }


          
    public void finalize() {
            System.err.println(
    "Employee " + toString() + " made redundant");
          }

        }



    創建緩存對象工廠,由于框架提供了一個基本的BaseKeyedPoolableObjectFactoy創建工廠,可以直接繼承并實現makeObject方法,也就是創建緩存對象的具體實現,當然還有其他的創建工廠,這里就不具體講了,可以查看Apache的相關資料。
    import org.apache.commons.pool.BaseKeyedPoolableObjectFactory;

    public class EmployeeFactory extends BaseKeyedPoolableObjectFactory {

        @Override
        
    public Object makeObject(Object key) throws Exception {
            
    return new Employee((String)key);
        }


         
    }

    客戶端的調用例子,pool.addObject增加緩存對象,borrowObject從緩存中獲取對象,如果沒有則會創建一個新對象,returnObject釋放對象,即使用完對象后要釋放對象到緩存中。
    public class TestKeyedObjectPool {
        
    public static void main(String args[]) throws Exception {

            GenericKeyedObjectPool pool 
    = new GenericKeyedObjectPool();
            pool.setFactory(
    new EmployeeFactory());

            pool.addObject(
    "Peter");
            pool.addObject(
    "Jerry");
            pool.addObject(
    "Richard");
            pool.addObject(
    "Peter");

          System.out.println(
    "Number of Peter employees in pool: " +
              pool.getNumIdle(
    "Peter"+ " out of total employees: " +
              pool.getNumIdle());

            Employee employee 
    = (Employee)pool.borrowObject("Peter");
            employee.doWork();
            pool.returnObject(
    "Peter", employee);
            
          System.out.println(
    "Number of Peter employees in pool: " +
                      pool.getNumIdle(
    "Peter"+ " out of total employees: " +
                      pool.getNumIdle());
          }


    }


    運行結果:
    Peter is created!
    Jerry is created
    !
    Richard is created
    !
    Peter is created
    !
    Number of Peter employees in pool: 
    2 out of total employees: 4
     Name: Peter,id:
    1 do some thing
    Number of Peter employees in pool: 
    2 out of total employees: 4

    posted on 2009-12-10 17:50 伊布 閱讀(2024) 評論(5)  編輯  收藏

    評論

    # re: Java對象池的簡單應用  回復  更多評論   

    之前寫過的,測試發現對象池性能不是太好,而且使用麻煩,因為有很多對象都是瞬態的,每次使用都需要初始化的。
    2009-12-12 22:47 | TiGERTiAN

    # re: Java對象池的簡單應用  回復  更多評論   

    使用對象池主要是為了提高系統性能常用的辦法,但也不是說任何情況、任何環境都適合使用,有些情況下,不使用反而性能更好些,因為使用緩存的話,也要花費資源去管理緩存的。
    個人建議:對于像“數據庫連接”、“網絡遠程連接(類似Socket連接)”等比較重的資源可以去用,性能會有很大的提升的。
    通過這個框架,可以自己去實現一個數據庫的連接池,也是不錯的。
    2009-12-14 10:50 | 伊布

    # re: Java對象池的簡單應用  回復  更多評論   

    看了這一句:
    pool.setFactory(new EmployeeFactory());
    本來利用對象池就是要減少new操作,一下子new EmployeeFactory(),一下子又new 其他的Factory,這好像這不是對象池應該做的啊。
    2009-12-19 13:53 | awp001

    # re: Java對象池的簡單應用  回復  更多評論   

    我這幾天正在研究對象池,大家多交流
    2009-12-19 13:54 | awp001

    # re: Java對象池的簡單應用  回復  更多評論   

    @awp001
    “利用對象池就是要減少new操作”,說的沒錯,使用對象池是為了提高性能,開始的時候預先創建若干個對象,把它放到池中,將來使用的時候也是從池中取出,使用后再回池里。
    pool.setFactory(new EmployeeFactory());
    是設置創建對象使用的工廠,使用了類似工廠模式,把創建Employee對象的職責都交個了這個EmployeeFactoyr類,由它統一負責創建具體的對象。
    所以說想用對象池的話,必須有三個東東:
    1)池(一般是一個)
    2)創建工廠(一般是一個)
    3)對象(大多數是多個)
    2009-12-21 10:36 | 伊布

    只有注冊用戶登錄后才能發表評論。


    網站導航:
    博客園   IT新聞   Chat2DB   C++博客   博問  
     
    主站蜘蛛池模板: 久久青青草原亚洲av无码| 中文字幕精品亚洲无线码二区 | 99久久99热精品免费观看国产| 国产在线精品免费aaa片| 成人福利免费视频| 日韩a在线观看免费观看| 成人午夜亚洲精品无码网站| 亚洲阿v天堂在线2017免费| 无码国产精品一区二区免费式芒果 | 日韩a毛片免费观看| 久久国产色AV免费观看| 免费夜色污私人影院在线观看| 久久亚洲精精品中文字幕| 亚洲高清毛片一区二区| 你是我的城池营垒免费看 | 免费人成再在线观看网站| 精品亚洲一区二区三区在线观看| 一级毛片在线播放免费| 我要看免费的毛片| 亚洲国产成人高清在线观看| 亚洲日韩精品无码AV海量| 久久久99精品免费观看| 亚洲精品韩国美女在线| 岛国精品一区免费视频在线观看| 巨胸喷奶水视频www网免费| 亚洲免费视频网站| 国产一级a毛一级a看免费视频| 久久亚洲精品国产精品黑人| 一级一看免费完整版毛片| 亚洲av无码一区二区三区不卡 | 美女视频黄a视频全免费网站一区 美女视频黄a视频全免费网站色 | 99精品视频在线观看免费播放 | 亚洲国产精品成人综合久久久| 永久免费av无码网站yy| 亚洲精品国产品国语在线| 一级特级aaaa毛片免费观看 | 五月婷婷在线免费观看| 亚洲精品国产成人99久久| 免费av欧美国产在钱| 久久亚洲私人国产精品vA| 日本黄色免费观看|