the apache tomcat native,Apache Commons Pool試用小記

 2023-11-09 阅读 17 评论 0

摘要:Apache Commons Pool小試一把 相比眾多牛人的自己連接池,Apache的Pool就是牛中的大牛了,這里小試一把。 環境: commons-pool-1.5.3-bin.zip jdk1.5 一、基本String對象測試 import org.apache.commons.pool.impl.GenericKeyedObjectPool; import org.apa
Apache Commons Pool小試一把
相比眾多牛人的自己連接池,Apache的Pool就是牛中的大牛了,這里小試一把。
環境:
commons-pool-1.5.3-bin.zip
jdk1.5
一、基本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
當運行到清除最早對象一行,內存狀態如下:
初略看看,Apache Commons pool功能還很強大,DBCP數據庫連接池就用了它,還可以對其進行參數配置。
二、自定義復雜對象測試
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字符串,目前沒有有效的辦法過濾掉,不讓其入池,雖然在工廠方法里做了努力。the apache tomcat native。
3、試圖將null入池,不會成功的,但也不拋異常。
4、對于池對象,使用應該遵循“接而有還,再借不難”-----從池中獲取,不用時候歸池,否則當池中沒有空閑可用的對象時候,程序會處于等待狀態,如果沒有顯式的調用歸還方法,則造成程序死鎖。
三、使用GenericObjectPool
import org.apache.commons.pool.impl.GenericObjectPool;
import org.apache.commons.pool.BasePoolableObjectFactory;

import java.util.Random;

/**
* Created by IntelliJ IDEA.
*
* @author leizhimin 2009-10-28 10:51:11
*/

public class Test2 {
????????public static void main(String[] args) throws Exception {
????????????????GenericObjectPool pool = new GenericObjectPool(new BasePoolableObjectFactory() {
????????????????????????public Object makeObject() throws Exception {
????????????????????????????????return new Random().nextFloat();
????????????????????????}
????????????????});

????????????????pool.addObject();
????????????????pool.addObject();
????????????????pool.addObject();
????????????????pool.addObject();
????????????????pool.addObject();
????????????????pool.addObject();
????????????????pool.addObject();
????????????????pool.addObject();
????????????????pool.addObject();
????????????????pool.addObject();
????????????????pool.addObject();
????????????????pool.addObject();

????????????????Object o = pool.borrowObject();
????????????????System.out.println(o);
????????????????pool.returnObject(o);

????????????????Object o1 = pool.borrowObject();
????????????????System.out.println(o1);

????????????????Object o2 = pool.borrowObject();
????????????????System.out.println(o2);

????????????????Object o3 = pool.borrowObject();
????????????????System.out.println(o3);

????????????????Object o4 = pool.borrowObject();
????????????????System.out.println(o4);


????????????????Object o5 = pool.borrowObject();
????????????????System.out.println(o5);


????????????????Object o6 = pool.borrowObject();
????????????????System.out.println(o6);

????????????????Object o7 = pool.borrowObject();
????????????????System.out.println(o7);

????????????????Object o8 = pool.borrowObject();
????????????????System.out.println(o8);

????????????????pool.returnObject(o1);
????????????????pool.returnObject(o2);
????????????????pool.returnObject(o3);
????????????????pool.returnObject(o4);
????????????????pool.returnObject(o5);
????????????????pool.returnObject(o6);
????????????????pool.returnObject(o7);
????????????????pool.returnObject(o8);

????????????????Object o9 = pool.borrowObject();
????????????????System.out.println(o9);
????????????????pool.returnObject(o9);

????????????????Object o10 = pool.borrowObject();
????????????????System.out.println(o10);
????????????????pool.returnObject(o10);

????????????????Object o11 = pool.borrowObject();
????????????????System.out.println(o11);
????????????????pool.returnObject(o11);

????????????????Object o12 = pool.borrowObject();
????????????????System.out.println(o12);
????????????????pool.returnObject(o12);

????????????????Object o13 = pool.borrowObject();
????????????????System.out.println(o13);
????????????????pool.returnObject(o13);

????????}
}
輸出:
0.7358789
0.7358789
0.15324193
0.7465391
0.7198403
0.7477861
0.37906575
0.049714446
0.9650687
0.9650687
0.9650687
0.9650687
0.9650687
0.9650687

Process finished with exit code 0
從內存狀態看到,這種對象池,沒法將指定的對象入池,只能通過工廠生成對象入池,而且無法給工廠傳遞參數。
這種池適合數據庫連接池等,所有的池對象拿出來都一樣用。apache使用?
經過上面三個例子綜合測試得知,池的大小是初始化配置的,在沒有顯式配置指定的情況下,池大小默認為8.可以通過GenericKeyedObjectPool.Config來配置。

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/5/168939.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息