參考博文:
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;
}
}
經過大量測試,發現在量級不夠大的情況下,上述問題基本解決。但是當量級大到一定程度時候,還是偶爾出現該問題。
該問題依然困擾着我?望路過高手隨手指點一下。感謝!