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;
    }
}

经过大量测试,发现在量级不够大的情况下,上述问题基本解决。但是当量级大到一定程度时候,还是偶尔出现该问题。

该问题依然困扰着我?望路过高手随手指点一下。感谢!

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