apache-common-pool2 異常:Returned object not currently part of this pool

參考博文:

https://issues.commons.apache.narkive.com/sdkDV3th/jira-created-pool-284-returned-object-not-currently-part-of-this-pool-when-using-mutable-objects

https://blog.csdn.net/liang_love_java/article/details/50510753

https://stackoverflow.com/questions/22824889/apache-pool-cant-return-object-in-spring-controller-service

 

異常: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;
    }
}

經過大量測試,發現在量級不夠大的情況下,上述問題基本解決。但是當量級大到一定程度時候,還是偶爾出現該問題。

該問題依然困擾着我?望路過高手隨手指點一下。感謝!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章