org.apache.commons.pool中PoolableObjectFactory和StackObjectPool分析
来源:互联网 发布:数据库查询语句 编辑:程序博客网 时间:2024/06/05 08:17
package org.apache.commons.pool;
public interfacePoolableObjectFactory<T> {
T makeObject() throwsException;
void destroyObject(T obj)throws Exception;
boolean validateObject(T obj);
void activateObject(T obj)throws Exception;
void passivateObject(T obj)throws Exception;
}
//部分代码
package org.apache.commons.pool.impl;
public class StackObjectPool<T>extendsBaseObjectPool<T>implements ObjectPool<T>{
@Deprecated
protectedStack<T>_pool =null;
@Deprecated
protected PoolableObjectFactory<T>_factory =null;
//传值时_factory实现PoolableObjectFactory接口,要覆写其五个方法
@Override
public synchronized T borrowObject()throwsException {
assertOpen();
T obj = null;
boolean newlyCreated =false;
while (null == obj) {
if (!_pool.empty()) {
obj = _pool.pop();//池中有对象则直接取
} else {
if(null ==_factory) {
thrownew NoSuchElementException();
} else {
obj = _factory.makeObject();
//池中有无对象,则创建对象
newlyCreated =true;
if (obj ==null) {
thrownew NoSuchElementException("PoolableObjectFactory.makeObject()returned null.");
}
}
}
if (null !=_factory &&null != obj) {
try {
_factory.activateObject(obj);
if (!_factory.validateObject(obj)) {
thrownew Exception("ValidateObject failed");
}
} catch (Throwable t) {
PoolUtils.checkRethrow(t);
try {
_factory.destroyObject(obj);
} catch (Throwable t2) {
PoolUtils.checkRethrow(t2);
// swallowed
} finally {
obj = null;
}
if (newlyCreated) {
thrownew NoSuchElementException(
"Could not create a validated object, cause: " +
t.getMessage());
}
}
}
}
_numActive++;
return obj;
}
@Override
public synchronized void returnObject(T obj) throws Exception {
boolean success = !isClosed();
if(null !=_factory) {
if(!_factory.validateObject(obj)) {
success = false;
} else {
try {
_factory.passivateObject(obj);
} catch(Exception e) {
success = false;
}
}
}
boolean shouldDestroy = !success;
_numActive--;
if (success) {
T toBeDestroyed = null;
if(_pool.size() >=_maxSleeping){
shouldDestroy = true;
toBeDestroyed = _pool.remove(0);// remove the stalest object
}
_pool.push(obj);//将对象添加到池中
obj = toBeDestroyed;// swap returned obj with the stalest one so it can bedestroyed
}
notifyAll(); // _numActive has changed
if(shouldDestroy) {// by constructor, shouldDestroy is false when _factory is null
try {
_factory.destroyObject(obj);
} catch(Exception e) {
// ignored
}
}
}
@Override
public synchronized void clear() {
if(null !=_factory) {
Iterator<T> it =_pool.iterator();
while(it.hasNext()) {
try {
_factory.destroyObject(it.next());
} catch(Exception e) {
// ignore error, keep destroying the rest
}
}
}
_pool.clear(); // Vector-->clear()-->removeAllElements();
}
@Override
public void close() throws Exception { //释放池对象
super.close(); // BasicObjectPool---> closed =true;
clear();
}
java.util.Vector--->
public synchronized void removeAllElements(){
modCount++;
// Let gc do its work
for (int i = 0; i <elementCount; i++)
elementData[i] = null;
elementCount = 0;
}
例子可以参考 博文 http://blog.csdn.net/kongxx/article/details/6607083
- org.apache.commons.pool中PoolableObjectFactory和StackObjectPool分析
- commons-pool实战之 PoolableObjectFactory和ObjectPool
- commons-pool实战之 PoolableObjectFactory、ObjectPool、 KeyedPoolableObjectFactory......
- org/apache/commons/dpcp/BasicDataSource和org/apache/commons/pool/impl/GenericObjectPool
- Apache Commons-Pool 源码分析
- org/apache/commons/pool/impl/GenericObjectPool
- NoClassDefFoundError: org/apache/commons/pool/KeyedObjectPoolFactory
- Apache commons-pool对象池原理分析
- Apache commons-pool对象池原理分析
- Apache commons-pool对象池原理分析
- Apache commons-pool对象池原理分析
- Apache commons-pool对象池原理分析
- org.apache.commons.pool---Apache的对象池实现。
- spring中dataSource的org.apache.commons.pool.impl.GenericObjectPool异常
- org/apache/commons/pool/impl/GenericObjectPool 的解决方法
- java.lang.NoClassDefFoundError: org/apache/commons/pool/impl/GenericObjectPool
- 对象池化技术 org.apache.commons.pool
- 对象池化技术 org.apache.commons.pool
- ASP.NET MVC 單元測試系列 (1):新手上路 / 開始撰寫!
- Maven插件
- Java Session 是如何实现的
- 直接对未签名的apk文件进行签名以及简单的项目混淆
- 欢迎参加 2014 Autodesk 产品开发培训
- org.apache.commons.pool中PoolableObjectFactory和StackObjectPool分析
- Windows Kernel32.dll--内核库函数提供的API
- Android_AppWidget_AppWidgetProvider分析与应用
- CXF客户端代码生成与服务调用(二)
- 容器的swap推荐写法
- MR分析
- 关于高清实时ES、PES、PS以及TS码流个人总结
- The server quit without updating PID file (/[FAILED]l/mysql/var/localhost.localdomain.pid)
- Maven命令