Apache Commons Pool2连接池代码

2013年,Apache Commons Pool 2.0 发布,这是一个完全重写的对象池的实现。实现的代码和原来差异很大,原来的一些例子就不能用了。按照上面的例子,用pool2的类和方法重写下。

ApacheCommons Pool 2.0 代码如下:

package test.ffm83.commons.pool;

import java.text.SimpleDateFormat;

import java.util.Date;

import org.apache.commons.lang.StringUtils;

import org.apache.commons.pool2.BasePooledObjectFactory;

import org.apache.commons.pool2.PooledObject;

import org.apache.commons.pool2.impl.DefaultPooledObject;

import org.apache.commons.pool2.impl.GenericObjectPool;

/**

* commons pool的简单实用,基于2.x版本

* 1. Factory  BasePooledObjectFactory

* 2. Pool的配置   
就是pool

* 3. Pool实例   Resource

* @author范芳铭

*/

public
class
Pool2BaseUsage {

public
static void
main(String[] args) {

finalGenericObjectPool<Resource> pool =
new GenericObjectPool<Resource>(

newTestPoolableObjectFactory());

pool.setMaxTotal(2);

for (int i = 0; i < 6; i++) {

new Thread(new Runnable() {

@Override

public
void
run() {

try {

Resourceobj = pool.borrowObject();//
注意,如果对象池没有空余的对象,那么这里会block

System.out.println(StringUtils.rightPad(obj.toString()+
",获取对象", 50,"-"));

Thread.sleep(5000);

pool.returnObject(obj);//归还连接池资源

System.out.println(StringUtils.leftPad(obj.toString()+
",归还对象", 50,
"-"));

}catch(Exception e) {

e.printStackTrace();

}

}

}).start();

}

}

/**

* commons pool的简单实用,基于2.x版本

* 1.x的 BasePoolableObjectFactory
类修改为 BasePooledObjectFactory

* @author范芳铭

*/

static
class
TestPoolableObjectFactory extends BasePooledObjectFactory<Resource>{

@Override

public Resource create()
throws Exception {

return
new
Resource();

}

@Override

publicPooledObject<Resource> wrap(Resource resource) {

return
new
DefaultPooledObject<Resource>(resource);

}

/**

* When an object is returned to the pool,clear the buffer.

*/

@Override

public
void
passivateObject(PooledObject<Resource> resource) {

//resource.getObject().setRid(-1);

}

}

static
class
Resource {

public
static int
id;

private
int
rid;

public Resource() {

synchronized (this) {

rid = id++;

}

}

public
int
getRid() {

return
rid;

}

public
void
setRid(int rid){

this.rid = rid;

}

@Override

public String toString() {

SimpleDateFormatdf = newSimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式

Stringstr = df.format(newDate()) +
","+ "id:"+
rid;

return str;

}

}

}

运行效果如下:

2014-12-19 15:51:58,id:1,获取对象---------------------

2014-12-19 15:51:58,id:0,获取对象---------------------

2014-12-19 15:52:03,id:0,获取对象---------------------

---------------------2014-12-1915:52:03,id:0,归还对象

---------------------2014-12-1915:52:03,id:1,归还对象

2014-12-19 15:52:03,id:1,获取对象---------------------

---------------------2014-12-1915:52:08,id:0,归还对象

2014-12-19 15:52:08,id:0,获取对象---------------------

---------------------2014-12-1915:52:08,id:1,归还对象

2014-12-19 15:52:08,id:1,获取对象---------------------

---------------------2014-12-1915:52:13,id:0,归还对象

---------------------2014-12-1915:52:13,id:1,归还对象

时间: 2024-08-04 10:14:08

Apache Commons Pool2连接池代码的相关文章

Apache Commons Pool2 源码分析 | Apache Commons Pool2 Source Code Analysis

Apache Commons Pool实现了对象池的功能.定义了对象的生成.销毁.激活.钝化等操作及其状态转换,并提供几个默认的对象池实现.在讲述其实现原理前,先提一下其中有几个重要的对象: PooledObject(池对象). PooledObjectFactory(池对象工厂). Object Pool(对象池). 下面分别详细讲解它们的实现. PooledObject(池对象) 用于封装对象(如:线程.数据库连接.TCP连接),将其包裹成可被池管理的对象.提供了两个默认的池对象实现: De

commons.pool2 对象池的使用

? 1 2 3 4 5 <dependency>     <groupId>org.apache.commons</groupId>     <artifactId>commons-pool2</artifactId>     <version>2.3</version> </dependency> 池对象工厂 PooledObjectFactory和池对象 DefaultPooledObject 先了解个概念

Apache common pool2 对象池

对象池的容器:包含一个指定数量的对象.从池中取出一个对象时,它就不存在池中,直到它被放回.在池中的对象有生命周期:创建,验证,销毁,对象池有助于更好地管理可用资源,防止JVM内部大量临时小对象,频繁触发垃圾回收,造成系统暂停.有许多的使用示例.特别是在应用服务器数据源池,线程池等都是对象池的使用,下面情况适合使用对象池: 同样的对象高频率使用 对象太大消耗很多内存 对象初始化需要时间 对象内涉及IO操作 (Streams, Sockets, DB, etc.) 对象并不是线程安全时. 很多人使用

Caused by: java.lang.NoClassDefFoundError: org/apache/commons/pool2/impl/GenericObjectPoolConfig

Caused by: java.lang.NoClassDefFoundError: org/apache/commons/pool2/impl/GenericObjectPoolConfig at java.lang.Class.getDeclaredMethods0(Native Method) at java.lang.Class.privateGetDeclaredMethods(Class.java:2701) at java.lang.Class.getDeclaredMethods

Apache Commons pool 简介和pool连接池代码

在实际中工作,我们经常遇到需要连接池的地方,特别是数据库连接池. 我们为什么需要池呢?因为这些资源的创建,都很消耗资源.因此,我们使用一个对象池,里面预先创建了一些资源对象.当我们需要时,从池中取出对象,而不需要时,把对象返回池中.这样就可以提高代码运行的效率. Apache Commons Pool(http://commons.apache.org/pool/)为我们提供了很方便的接口来实现对象池.我们唯一需要实现的就是如何产生对象,而不用去考虑一堆多线程问题. 2013年,Apache C

从commons pool2到池

转载请注明:http://blog.csdn.net/HEL_WOR/article/details/51224388 池该如何理解?我们经常提到的数据库连接池,线程池,对象池. 池这个概念,在计算机里,应该如何用代码来描述? 在网页上可以找到很多关于数据库连接池的描述,实现DataSource接口,用一个链表或者只要能保存数据的容器将事先创建好的连接保存起来,一个连接池就成型了,在需要使用的时候去容器里取出一个连接,使用完毕后归还这个连接,如果想要重写close方法让连接归还到容器中而不是被关

Java的Redis连接池代码性能不错

其实这个是引用自网友http://blog.csdn.net/tuposky/article/details/45340183,有2个版本,差别就是ReentrantLock和synchronized.另外原作者使用了断言,我觉得这个还是不用为好. ReentrantLock版 import java.util.concurrent.locks.ReentrantLock; import org.apache.commons.lang.StringUtils; import org.apache

数据源配置与连接池代码

<Resource name="jdbc/news" auth="Container" type="javax.sql.DataSource" maxActive="100" maxIdle="30" maxWait="10000" username="myoracle" password="tiger" driverClassName=&q

连接池Commons Pool2的使用

客户端这边,如果每次都临时建立一个新的连接,那么连接的开销非常大. 业内常用的连接池组件是 Commons Pool2---版本 2.4.2 ==================具体代码如下:[http://commons.apache.org/proper/commons-pool/examples.html] package service.pool; import org.apache.commons.pool2.BasePooledObjectFactory; import org.ap