隨筆 - 1, 文章 - 0, 評(píng)論 - 5, 引用 - 0
          數(shù)據(jù)加載中……

          Java對(duì)象池的簡(jiǎn)單應(yīng)用

          Apache 的commons pool框架為我們提供了對(duì)象池封裝技術(shù),也就是大家說的緩存技術(shù),個(gè)人感覺還是不錯(cuò)的。

          以下是一個(gè)簡(jiǎn)單的例子,希望能夠起到拋磚引玉的作用,當(dāng)然如果要應(yīng)用到實(shí)際項(xiàng)目中的話,還需要完善很多內(nèi)容,比如對(duì)象池的參數(shù)配置、日志處理、異常解決。。。

          需要緩存的對(duì)象:
          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");
                }

              }



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

          public class EmployeeFactory extends BaseKeyedPoolableObjectFactory {

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


               
          }

          客戶端的調(diào)用例子,pool.addObject增加緩存對(duì)象,borrowObject從緩存中獲取對(duì)象,如果沒有則會(huì)創(chuàng)建一個(gè)新對(duì)象,returnObject釋放對(duì)象,即使用完對(duì)象后要釋放對(duì)象到緩存中。
          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());
                }


          }


          運(yùn)行結(jié)果:
          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 伊布 閱讀(2029) 評(píng)論(5)  編輯  收藏

          評(píng)論

          # re: Java對(duì)象池的簡(jiǎn)單應(yīng)用  回復(fù)  更多評(píng)論   

          之前寫過的,測(cè)試發(fā)現(xiàn)對(duì)象池性能不是太好,而且使用麻煩,因?yàn)橛泻芏鄬?duì)象都是瞬態(tài)的,每次使用都需要初始化的。
          2009-12-12 22:47 | TiGERTiAN

          # re: Java對(duì)象池的簡(jiǎn)單應(yīng)用  回復(fù)  更多評(píng)論   

          使用對(duì)象池主要是為了提高系統(tǒng)性能常用的辦法,但也不是說任何情況、任何環(huán)境都適合使用,有些情況下,不使用反而性能更好些,因?yàn)槭褂镁彺娴脑挘惨ㄙM(fèi)資源去管理緩存的。
          個(gè)人建議:對(duì)于像“數(shù)據(jù)庫(kù)連接”、“網(wǎng)絡(luò)遠(yuǎn)程連接(類似Socket連接)”等比較重的資源可以去用,性能會(huì)有很大的提升的。
          通過這個(gè)框架,可以自己去實(shí)現(xiàn)一個(gè)數(shù)據(jù)庫(kù)的連接池,也是不錯(cuò)的。
          2009-12-14 10:50 | 伊布

          # re: Java對(duì)象池的簡(jiǎn)單應(yīng)用  回復(fù)  更多評(píng)論   

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

          # re: Java對(duì)象池的簡(jiǎn)單應(yīng)用  回復(fù)  更多評(píng)論   

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

          # re: Java對(duì)象池的簡(jiǎn)單應(yīng)用  回復(fù)  更多評(píng)論   

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

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 个旧市| 古浪县| 营口市| 五峰| 普安县| 井陉县| 凌源市| 靖安县| 凭祥市| 邵东县| 鹰潭市| 呼图壁县| 玉环县| 彰化市| 同仁县| 比如县| 香格里拉县| 鞍山市| 张家港市| 天长市| 维西| 墨脱县| 辽宁省| 克拉玛依市| 洱源县| 津市市| 江孜县| 宁津县| 三穗县| 龙胜| 阿城市| 松滋市| 思茅市| 疏勒县| 泰来县| 巴林右旗| 辽源市| 肇东市| 苏州市| 繁昌县| 霍山县|