【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>
Thrift本身没有提供连接池,我们可以用Apache Commons Pool2来实现一个
一、定义对象工厂
BasePooledObjectFactory<T> extends BaseObject implements PooledObjectFactory<T>
public class TProtocolFactory extends BasePooledObjectFactory<TProtocol> {
private String host;
private int port;
private boolean keepAlive =true;
public TProtocolFactory(String host, int port, boolean keepAlive) {
this.host = host;
this.port = port;
this.keepAlive = keepAlive;
}
/**
* 创建对象
* @return
* @throws Exception
*/
@Override
public TProtocol create() throws Exception {
TSocket socket = new TSocket(host,port);
//使用 TFramedTransport传输
TTransport tTransport = new TFramedTransport(socket);
tTransport.open();
return new TCompactProtocol(tTransport);
}
@Override
public PooledObject<TProtocol> wrap(TProtocol protocol) {
return new DefaultPooledObject<TProtocol>(protocol);
}
/**
* 对象钝化(returnObject时触发)
* @param pooledObject
* @throws Exception
*/
@Override
public void passivateObject(PooledObject<TProtocol> pooledObject) throws TTransportException {
if (keepAlive){
pooledObject.getObject().getTransport().flush();
pooledObject.getObject().getTransport().close();
}
}
/**
* 对象激活(borrowObject时触发)
* @param pooledObject
* @throws TTransportException
*/
@Override
public void activateObject(PooledObject<TProtocol> pooledObject) throws TTransportException {
if (!pooledObject.getObject().getTransport().isOpen()){
pooledObject.getObject().getTransport().open();
}
}
/**
* 对象销毁(clear时会触发)
* @param pooledObject
* @throws TTransportException
*/
@Override
public void destroyObject(PooledObject<TProtocol> pooledObject) throws TTransportException{
passivateObject(pooledObject);
pooledObject.markAbandoned();
}
/**
* 验证对象有效性
* @param pooledObject
* @return
*/
@Override
public boolean validateObject(PooledObject<TProtocol> pooledObject){
if (pooledObject.getObject() != null){
if (pooledObject.getObject().getTransport().isOpen()){
return true;
}
try {
pooledObject.getObject().getTransport().open();
return true;
} catch (TTransportException e) {
e.printStackTrace();
}
}
return false;
}
}
需要重写:activateObject(对象激活) 及 passivateObject(对象钝化)
二、定义对象池
使用GenericObjectPool的默认实现
public class AutoClearGenericObjectPool<T> extends GenericObjectPool<T>{
public AutoClearGenericObjectPool(PooledObjectFactory<T> factory) {
super(factory);
}
public AutoClearGenericObjectPool(PooledObjectFactory<T> factory, GenericObjectPoolConfig config) {
super(factory, config);
}
@Override
public void returnObject(T obj) {
super.returnObject(obj);
//空闲数>=激活数时,清理掉空闲连接
if (getNumIdle() >= getNumActive()) {
clear();
}
}
}
common-pools提供了对象池的默认实现:GenericObjectPool 但是该对象池中,对于处于空闲的对象,需要手动调用clear来释放空闲对象,如果希望改变这一行为,可以自己派生自己的子类,重写returnObject方法,上面的代码中,每次归还对象时,如果空闲的对象比激活的对象还要多(即:一半以上的对象都在打酱油),则调用clear方法。
来源:oschina
链接:https://my.oschina.net/u/3737136/blog/1833674