基于Apache Common-pool2理解连接池
基于Apache Common-pool2理解连接池
目的
文档介绍
PooledObjectState
事件 | 说明 |
---|
IDLE | 在队列中,但是为使用 |
ALLOCATED | 正在使用 |
EVICTION | 在队列中,但是正在被测试,可能清除 |
EVICTION_RETURN_TO_HEAD | 不在队列中,目前正在测试可能的驱逐。在测试时试图借用该对象,该对象被删除从队列中。它应该返回到队列的头部一次,驱逐测试完成。 |
VALIDATION | 在队列中,当前正在被校验 |
VALIDATION_PREALLOCATED | 不在队列中,当前正在验证。这东西是借的正在进行验证,由于配置了testOnBorrow,所以删除了它,从队列中预先分配。应该在验证之后分配它 |
VALIDATION_RETURN_TO_HEAD | 不在队列中,当前正在验证。试图借用对象是在之前进行驱逐测试时制作的,该测试将其移除队列。验证之后,它应该返回到队列的头部完成 |
INVALID | 无效的,维护失败和将要被摧毁的对象 |
ABANDONED | 废弃的 |
RETURNING | 返回到池子中 |
java代码实现
代码实现
package com;
import org.apache.commons.pool2.BasePooledObjectFactory;
import org.apache.commons.pool2.PooledObject;
import org.apache.commons.pool2.impl.DefaultPooledObject;
public class StringPoolObject extends BasePooledObjectFactory<StringBuffer> {
@Override
public StringBuffer create() {
System.out.println("创造了一个object");
return new StringBuffer();
}
@Override
public PooledObject<StringBuffer> wrap(StringBuffer obj) {
DefaultPooledObject<StringBuffer> stringBufferDefaultPooledObject = new DefaultPooledObject<>(obj);
System.out.println("wrap状态为-->"+stringBufferDefaultPooledObject.getState());
return stringBufferDefaultPooledObject;
}
@Override
public void passivateObject(PooledObject<StringBuffer> p) throws Exception {
System.out.println("passivateObject状态为-->"+p.getState());
super.passivateObject(p);
}
}
package com;
import org.apache.commons.pool2.ObjectPool;
import org.apache.commons.pool2.PooledObjectFactory;
import org.apache.commons.pool2.impl.GenericObjectPool;
import java.util.Random;
import java.util.concurrent.atomic.AtomicInteger;
public class MyStringUtils {
private ObjectPool<StringBuffer> objectPool;
private AtomicInteger count;
public MyStringUtils(ObjectPool<StringBuffer> objectPool) {
this.objectPool = objectPool;
count = new AtomicInteger();
}
public StringBuffer read() throws Exception {
return objectPool.borrowObject();
}
public String write(StringBuffer write) throws Exception {
Random random = new Random();
int randomValue = random.nextInt(300);
int order = count.addAndGet(1);
StringBuffer append = write.append("第几个写的:").append(order).append("-->").append("写了什么:").append(randomValue);
objectPool.returnObject(write);
return append.toString();
}
public static void main(String[] args) throws Exception {
PooledObjectFactory pooledObjectFactory = new StringPoolObject();
ObjectPool objectPool = new GenericObjectPool(pooledObjectFactory);
MyStringUtils myStringUtils = new MyStringUtils(objectPool);
StringBuffer read = myStringUtils.read();
myStringUtils.write(read);
StringBuffer data = myStringUtils.read();
System.out.println("数据是-->" + data.toString());
}
}
输出
创造了一个Object
wrap状态为-->IDLE
passivateObject状态为-->RETURNING
数据是-->第几个写的:1-->写了什么:240
接口
PooledObjectFactor
作用
- 提供poolObject的工厂,顶层的抽象类是BasePooledObjectFactory,复写create和wrap方法
代码
public interface PooledObjectFactory<T> {
PooledObject<T> makeObject();
void activateObject(PooledObject<T> obj);
void passivateObject(PooledObject<T> obj);
boolean validateObject(PooledObject<T> obj);
void destroyObject(PooledObject<T> obj);
}
PooledObject
作用
- 提供对象的包装类,封装了状态变更的方法,默认实现类是DefaultPooledObject
代码
public interface PooledObject<T> extends Comparable<PooledObject<T>> {
T getObject();
long getCreateTime();
long getActiveTimeMillis();
default long getBorrowedCount() {
return -1;
}
long getIdleTimeMillis();
long getLastBorrowTime();
long getLastReturnTime();
long getLastUsedTime();
boolean startEvictionTest();
boolean endEvictionTest(Deque<PooledObject<T>> idleQueue);
boolean allocate();
boolean deallocate();
void setLogAbandoned(boolean logAbandoned);
default void setRequireFullStackTrace(boolean requireFullStackTrace) {
}
void use();
void printStackTrace(PrintWriter writer);
PooledObjectState getState();
void markAbandoned();
void markReturning();
@Override
int compareTo(PooledObject<T> other);
@Override
boolean equals(Object obj);
@Override
int hashCode();
@Override
String toString();
}
ObjectPool
作用
- 提供类使从池对象中使用方法,实现类是GenericObjectPool
代码
public interface ObjectPool<T> extends Closeable {
T borrowObject() throws Exception, NoSuchElementException,
IllegalStateException;
void returnObject(T obj) throws Exception;
void invalidateObject(T obj) throws Exception;
void addObject() throws Exception, IllegalStateException,
UnsupportedOperationException;
int getNumIdle();
int getNumActive();
void clear() throws Exception, UnsupportedOperationException;
void close();
}
实现类分析
DefaultPooledObject
方法 | 功能 | 状态变更 |
---|
allocate | 分配对象 | IDLE -> ALLOCATED |
deallocate | 释放这对象 | ALLOCATED -> IDLE |
invalidate | 无效对象 | * -> INVALID |
startEvictionTest | 无效对象 | IDLE -> EVICTION |
endEvictionTest | 无效对象 | EVICTION/EVICTION_RETURN_TO_HEAD -> IDLE |
startEvictionTest | 无效对象 | IDLE -> EVICTION |
文档地址
Common-pool2 文档地址