使用codis的java端jodis时 ,看到proxy 的PooledObject 对象的定义为
public PooledObject(String addr, JedisPool pool) { this.addr = addr; this.pool = pool; }
而 jedis是直接使用了JedisPool,JedisPool有个returnResource的方法把连接放回连接池。
public class JedisPool extends Pool<Jedis> { ... @Deprecated public void returnResource(final Jedis resource) { if (resource != null) { try { resource.resetState(); returnResourceObject(resource); } catch (Exception e) { returnBrokenResource(resource); throw new JedisException("Could not return the resource to the pool", e); } } }
考虑PooledObject如何实现returnResource? 上网找了以后发现,
/**
* The 2.6+ Jedis and the current Jodis have implemented the closeable
* interface . Therefore, you don't need to use pool to call
* returnResource() and you should invoke jedis.close() when you need to
* release the resource.
*/
于是,
@Override public void close() throws DataAccessException { // super.close(); this.getNativeConnection().close(); }