从源码角度看JedisPoolConfig参数配置 (5)

从Jedis3.0版本后pool.returnResource()遭弃用,官方重写了Jedis的close方法用以代替;官方建议应用redis.clients.jedis#Jedis的close方法进行资源回收,官方代码如下:

@Override
 public 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#returnObject
public 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类中。

 

小结,后悔有期

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wppxds.html