我的天啊,這幾天要被jedis逼瘋了,網上好多資料並沒有介紹jedis鏈接釋放不了的方法,我確定他們那些老人肯定知道都,就是不說,你們說氣人不。還有要吐槽哈jedis源碼開發的那些家伙,怎么寫的代碼,連注釋都沒有,所以已后啊,程序員們,一定要寫注釋,好好的,坑人啊,好了,發泄發了,干正事!!!!
之前我寫過spring 之jedis操作redis主從,在clinetConn類有個方法close(),這個方法有點問題,也是我要說的。
jedis.close();
jedispool.returnBrokenResource();
jedispool.returnResource();
jedis.quit();
jedis.disconnection();
以上這幾個方法吧都是有關釋放資源的,別的版本的jedis我不知道,jedis-2.9以上的版本已經使用了jedis.close();下面看看2.9以上版本的close()方法
public void close() {
if (dataSource != null) {
if ( client.isBroken()) {
this.dataSource.returnBrokenResource(this);
} else {
this.dataSource.returnResource(this);
}
} else {
client.close();
}
}
看到了吧,jedis2.9以上的版本的close方法把 jedispool.returnBrokenResource();jedispool.returnResource()包括了,所以直接jedis.close()就可以釋放連接了,但是有點肯爹的是,如果你在使用redis的時侯,想要close(),就不能釋放,所以你先要退出client,就要用jedis.quit(),這樣就完事了,有網上的資料是:
public void close(jedis){
//.....
jedis.quit();
jedis.disconnection();
}
//完了發現使用了jedis.disconnection();之后,jedis又可以鏈接redis了,而且可以操作redis,
然后請看jedis.disconnection()的源碼
public void disconnect() {
if (isConnected()) {
try {
outputStream.flush();
socket.close();
} catch (IOException ex) {
broken = true;
throw new JedisConnectionException(ex);
} finally {
IOUtils.closeQuietly(socket);
}
}
}
紅色標記的代碼,看看這兒http://blog.csdn.net/cwmbecoming/article/details/3265343,所以返回資源的方法如下:
public void closeJedisPool(Jedis jedis,int flag) {
// System.out.println(Client.isBroken());
if(flag==0){
jedis.close();
if(jedis.isConnected()){
try{
System.out.println("退出"+jedis.toString()+":"+jedis.quit());
jedis.disconnect();
}catch(Exception e){
System.out.println("退出失敗");
e.printStackTrace();
}
}
jedis.close();
}