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

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

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

    paulwong

    對象池

    如果一個B/S的應用,并發量在2000以上時,新建的對象累積會占用大量內存,當超過一定數量的時候,會報內存不夠,使用享元模式就可以解決這一問題,也就是建立對象池。現在的方案可以使用Apache Commons Pool

    一、基本String對象測試
    import org.apache.commons.pool.impl.GenericKeyedObjectPool; 
    import org.apache.commons.pool.BaseKeyedPoolableObjectFactory; 

    /** 
    * Created by IntelliJ IDEA. 

    @author leizhimin 2009-10-27 17:46:18 
    */
     
    public class Test 
            
    public static void main(String[] args) throws Exception 
                    
    //創建一個對象池 
                    GenericKeyedObjectPool pool = new GenericKeyedObjectPool(new BaseKeyedPoolableObjectFactory() 
                            @Override 
                            
    public Object makeObject(Object o) throws Exception 
                                    
    return o; 
                            }
     
                    }
    ); 

                    
    //添加對象到池,重復的不會重復入池 
                    pool.addObject("a"); 
                    pool.addObject(
    "a"); 
                    pool.addObject(
    "b"); 
                    pool.addObject(
    "x"); 

                    
    //清除最早的對象 
                    pool.clearOldest(); 

                    
    //獲取并輸出對象 
                    System.out.println(pool.borrowObject("a")); 
                    System.out.println(pool.borrowObject(
    "b")); 
                    System.out.println(pool.borrowObject(
    "c")); 
                    System.out.println(pool.borrowObject(
    "c")); 
                    System.out.println(pool.borrowObject(
    "a")); 

                    
    //輸出池狀態 
                    System.out.println(pool.getMaxIdle()); 
                    System.out.println(pool.getMaxActive()); 

            }
     
    }

    輸出結果:
    a
    b
    c
    c
    a
    8
    8

    Process finished with exit code 0

    二、自定義復雜對象測試

    import org.apache.commons.pool.impl.GenericKeyedObjectPool; 
    import org.apache.commons.pool.BaseKeyedPoolableObjectFactory; 

    /** 
    * Created by IntelliJ IDEA. 

    @author leizhimin 2009-10-27 17:46:18 
    */
     
    public class Test 
            
    public static void main(String[] args) throws Exception 
                    
    //創建一個對象池 
                    GenericKeyedObjectPool pool = new GenericKeyedObjectPool(new BaseKeyedPoolableObjectFactory() 
                            @Override 
                            
    public Object makeObject(Object o) throws Exception 
                                    
    if (o != null && o instanceof User) 
                                            
    return o; 
                                    
    else 
                                            
    return null
                            }
     
                    }
    ); 

                    
    //添加對象到池,重復的不會重復入池 
                    pool.addObject("a"); 
                    pool.addObject(
    "b"); 
                    pool.addObject(
    "x"); 
                    pool.addObject(
    null); 
                    pool.addObject(
    null); 
                    pool.addObject(
    null); 
                    pool.addObject(
    new User("zhangsan""123")); 
                    pool.addObject(
    new User("lisi""112")); 
                    pool.addObject(
    new User("lisi""112"32)); 
                    pool.addObject(
    new User("lisi""112"32"一個爛人!")); 


                    
    //清除最早的對象 
                    pool.clearOldest(); 

                    
    //獲取并輸出對象 
                    User u1 = new User("lisi""112"32"一個爛人!"); 
                    System.out.println(pool.borrowObject(u1)); 
                    pool.returnObject(u1,u1); 

                    
    //獲取并輸出對象 
                    User u2 = new User("lisi""112"32"一個爛人!"); 
                    System.out.println(pool.borrowObject(u2)); 
                    pool.returnObject(u2,u2); 

                    
    //獲取并輸出對象 
                    User u3 = new User("lisi""112"32); 
                    System.out.println(pool.borrowObject(u3)); 
                    pool.returnObject(u3,u3); 

                    
    //獲取并輸出對象 
                    User u4 = new User("lisi""112"); 
                    System.out.println(pool.borrowObject(u4)); 
                    pool.returnObject(u4,u4); 

                    System.out.println(pool.borrowObject(u4)); 
                    pool.returnObject(u4,u4); 
                    System.out.println(pool.borrowObject(u4)); 
                    pool.returnObject(u4,u4); 
                    System.out.println(pool.borrowObject(u4)); 
                    pool.returnObject(u4,u4); 
                    System.out.println(pool.borrowObject(u4)); 
                    pool.returnObject(u4,u4); 
                    System.out.println(pool.borrowObject(u4)); 
                    pool.returnObject(u4,u4); 
                    System.out.println(pool.borrowObject(u4)); 
                    pool.returnObject(u4,u4); 
                    System.out.println(pool.borrowObject(u4)); 
                    pool.returnObject(u4,u4); 





                    System.out.println(pool.borrowObject(
    new User("lisi""112"))); 
    //                System.out.println(pool.borrowObject(new User("lisi", "112"))); 

                    
    //輸出池狀態 
                    System.out.println(pool.getMaxIdle()); 
                    System.out.println(pool.getMaxActive()); 
                    pool.clearOldest(); 
                    pool.close(); 

            }
     
    }
     

    class User 
            
    private String name; 
            
    private String pswd; 
            
    private int age; 
            
    private String reamark; 

            User() 

            }
     

            User(String name, String pswd) 

                    
    this.name = name; 
                    
    this.pswd = pswd; 
            }
     

            User(String name, String pswd, 
    int age) 
                    
    this.name = name; 
                    
    this.pswd = pswd; 
                    
    this.age = age; 
            }
     

            User(String name, String pswd, 
    int age, String reamark) 
                    
    this.name = name; 
                    
    this.pswd = pswd; 
                    
    this.age = age; 
                    
    this.reamark = reamark; 
            }
     

            
    public String getName() 
                    
    return name; 
            }
     

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

            
    public String getPswd() 
                    
    return pswd; 
            }
     

            
    public void setPswd(String pswd) 
                    
    this.pswd = pswd; 
            }
     

            
    public int getAge() 
                    
    return age; 
            }
     

            
    public void setAge(int age) 
                    
    this.age = age; 
            }
     

            
    public String getReamark() 
                    
    return reamark; 
            }
     

            
    public void setReamark(String reamark) 
                    
    this.reamark = reamark; 
            }
     

            @Override 
            
    public boolean equals(Object o) 
                    
    if (this == o) return true
                    
    if (o == null || getClass() != o.getClass()) return false

                    User user 
    = (User) o; 

                    
    if (!name.equals(user.name)) return false
                    
    if (!pswd.equals(user.pswd)) return false

                    
    return true
            }
     

            @Override 
            
    public int hashCode() 
                    
    int result = name.hashCode(); 
                    result 
    = 31 * result + pswd.hashCode(); 
                    
    return result; 
            }
     

            @Override 
            
    public String toString() 
                    
    return "User{" + 
                                    
    "name='" + name + '\'' + 
                 
                       
    ", pswd='" + pswd + '\'' + 
                                    ", age=" + age + 
                                    
    ", reamark='" + reamark + '\'' + 
                                    '}'
            }
     
    }

    測試結果:
    User{name='lisi', pswd='112', age=32, reamark='null'}
    User{name='lisi', pswd='112', age=32, reamark='一個爛人!'}
    User{name='lisi', pswd='112', age=32, reamark='一個爛人!'}
    User{name='lisi', pswd='112', age=32, reamark='null'}
    User{name='lisi', pswd='112', age=0, reamark='null'}
    User{name='lisi', pswd='112', age=0, reamark='null'}
    User{name='lisi', pswd='112', age=0, reamark='null'}
    User{name='lisi', pswd='112', age=0, reamark='null'}
    User{name='lisi', pswd='112', age=0, reamark='null'}
    User{name='lisi', pswd='112', age=0, reamark='null'}
    User{name='lisi', pswd='112', age=0, reamark='null'}
    User{name='lisi', pswd='112', age=0, reamark='null'}
    8
    8

    Process finished with exit code 0

    這次測試得出一些有用的結論:
    1、復雜對象應該實現equals() 、hashCode()方法,以便不重復入池。
    2、對于非入池的目標對象,比如a、b、x字符串,目前沒有有效的辦法過濾掉,不讓其入池,雖然在工廠方法里做了努力。
    3、試圖將null入池,不會成功的,但也不拋異常。
    4、對于池對象,使用應該遵循“接而有還,再借不難”-----從池中獲取,不用時候歸池,否則當池中沒有空閑可用的對象時候,程序會處于等待狀態,如果沒有顯式的調用歸還方法,則造成程序死鎖。

    池的大小是初始化配置的,在沒有顯式配置指定的情況下,池大小默認為8.可以通過GenericKeyedObjectPool.Config來配置。

    posted on 2011-10-23 17:02 paulwong 閱讀(350) 評論(0)  編輯  收藏 所屬分類: 性能優化

    主站蜘蛛池模板: 精品国产免费一区二区| 国产午夜精品理论片免费观看 | 亚洲国产成人精品青青草原| 花蝴蝶免费视频在线观看高清版 | 亚洲精品无码少妇30P| 女人张开腿等男人桶免费视频 | 最新亚洲人成网站在线观看| 麻豆国产入口在线观看免费| 亚洲成a∧人片在线观看无码| 日韩毛片免费在线观看| 男人j进女人p免费视频| 国产啪亚洲国产精品无码| 精品久久久久久无码免费| 亚洲VA中文字幕无码毛片| 中文字幕免费高清视频| 国产成+人+综合+亚洲专| 在线播放免费人成视频在线观看| 亚洲av无码一区二区三区在线播放| 国产精品公开免费视频| 久久免费国产精品| 亚洲V无码一区二区三区四区观看| 最刺激黄a大片免费网站| 亚洲毛片基地4455ww| 免费乱理伦在线播放| 免费在线观影网站| 亚洲三级中文字幕| 四虎免费影院4hu永久免费| 99久久婷婷免费国产综合精品| 亚洲Av无码专区国产乱码DVD| 欧美三级在线电影免费| 免费看一级高潮毛片| 亚洲久本草在线中文字幕| 最近的中文字幕大全免费版| 十八禁的黄污污免费网站| 亚洲A∨无码一区二区三区| 好男人视频在线观看免费看片| 亚洲精品视频免费观看| 亚洲乱码日产精品BD在线观看| 亚洲av无码国产精品色在线看不卡 | 亚洲片一区二区三区| 免费人成视频在线观看网站|