参考博文:
https://blog.csdn.net/liang_love_java/article/details/50510753
异常:Returned object not currently part of this pool
主要利用common-pool2生成socket连接池。
@Override
public SocketConnection borrowConnection() throws Exception {
return objectPool.borrowObject();
}
@Override
public void returnConnection(SocketConnection connection) {
objectPool.returnObject(connection);
}
但是经过JMeter进行多线程测试时候,在每秒五六百的吞吐量的情况下,几分钟之后就会提示Returned object not currently part of this pool。
经过在网上浏览大量的帖子,基本上说的问题都是因为对象的状态发生更改,则hashCode将发生更改,因此将无法关联此对象,因为它存储了旧的hashCode,才导致Returned object not currently part of this pool。
绝大多数的修改意见都是重写DefaultPooledObject<T>对象的equals()和hashcode()方法,来解决问题。
public class DefaultCorePooledObject <T> extends DefaultPooledObject<T> {
private final UUID id = UUID.randomUUID();
public DefaultCorePooledObject(T object) {
super(object);
}
@Override
public boolean equals(Object o) {
if (this == o)
return true;
if (!(o instanceof DefaultCorePooledObject))
return false;
DefaultCorePooledObject that = (DefaultCorePooledObject) o;
if (id != null ? !id.equals(that.id) : that.id != null)
return false;
return true;
}
@Override
public int hashCode() {
return id != null ? id.hashCode() : 0;
}
}
经过大量测试,发现在量级不够大的情况下,上述问题基本解决。但是当量级大到一定程度时候,还是偶尔出现该问题。
该问题依然困扰着我?望路过高手随手指点一下。感谢!