从Jedis3.0版本后pool.returnResource()遭弃用,官方重写了Jedis的close方法用以代替;官方建议应用redis.clients.jedis#Jedis的close方法进行资源回收,官方代码如下:
@Overridepublic void close() {
if (dataSource != null) {
JedisPoolAbstract pool = this.dataSource;
this.dataSource = null;
if (client.isBroken()) {
pool.returnBrokenResource(this);
} else {
pool.returnResource(this);
}
} else {
super.close();
}
}
这里主要看:pool.returnResource(this);
//org.apache.commons.pool2.impl.GenericObjectPool#returnObjectpublic void returnObject(final T obj) {
// 获取要释放的实例对象
final PooledObject<T> p = allObjects.get(new IdentityWrapper<>(obj));
if (p == null) {
if (!isAbandonedConfig()) {
throw new IllegalStateException(
"Returned object not currently part of this pool");
}
return; // Object was abandoned and removed
}
// 将对象标记为返回池的状态。
markReturningState(p);
final long activeTime = p.getActiveTimeMillis();
// 这里就和上面配置的参数有关系,释放的时候是否做连接有效性检测(ping)
if (getTestOnReturn() && !factory.validateObject(p)) {
try {
destroy(p);
} catch (final Exception e) {
swallowException(e);
}
try {
ensureIdle(1, false);
} catch (final Exception e) {
swallowException(e);
}
updateStatsReturn(activeTime);
return;
}
// 检查空闲对象,如果最大空闲对象数小于当前idleObjects大小,则销毁
final int maxIdleSave = getMaxIdle();
if (isClosed() || maxIdleSave > -1 && maxIdleSave <= idleObjects.size()) {
try {
destroy(p);
} catch (final Exception e) {
swallowException(e);
}
} else {
// 否则加入到空闲队列中,空闲队列是一个双端队列
// getLifo 也和配置的参数有关,默认True
if (getLifo()) {
// last in first out,加到队头
idleObjects.addFirst(p);
} else {
// first in first out ,加到队尾
idleObjects.addLast(p);
}
}
updateStatsReturn(activeTime);
}
上面创建和释放删除了一些代码,具体完整代码都是在GenericObjectPool类中。
小结,后悔有期