redisクライアントjedisの小さなバグ
6808 ワード
この間redis関連のコードを書きました
誰が最近ずっと問題が発生して、間違いはjedisがデータを追加する時タイプArriylistを返してLong型に変換することができません
しかしよく見ると、saddメソッドの戻りタイプは確かにLong型で、いつリストになったのか
ネット上で探して、同じく同じネットユーザーが同じ問題に出会って、接続のタイムアウトがもたらしたと言って、このように招いたのかどうか分かりませんが、私のコードは確かにタイムアウト異常があります
呼び出し時にcathで異常が発生し、接続プールreturnBrokenResourceを呼び出す方法は次のとおりです.
[java]
view plain
copy
print
?
Jedis jedis = getJedispool().getResource(); try {
jedis.keys("*"); } catch (Exception e) {
e.printStackTrace(); jedisPool.returnBrokenResource(jedis);
System.out.println("return already"); }
returnbrokenresourceのブロックが下に行かないことを発見して、それからソースコードを見つけます
JedisPool.java
[java]
view plain
copy
print
?
public void destroyObject(final Object obj) throws Exception { if (obj instanceof Jedis) {
final Jedis jedis = (Jedis) obj; if (jedis.isConnected()) {
try { try {
jedis.quit(); } catch (Exception e) {
} jedis.disconnect();
} catch (Exception e) {
} }
} }
jedisに止まります.quit()これは行かないで、更に中へ行きます
[java]
view plain
copy
print
?
protected String getStatusCodeReply() { flush();
pipelinedCommands--; final byte[] resp = (byte[]) protocol.read(inputStream);
if (null == resp) { return null;
} else { return SafeEncoder.encode(resp);
} }
final byte[]resp=(byte[]protocol.read(inputStream)この行
私の能力は限りがあって、本当についていけません
quit()歩けないなら、私はそのまま下へ行きます.
コードを変更してjedisを注記します.直接行くdisconnect()
OK、この接続はやっと正常に接続プールに戻りました
その後接続プール接続数を1に設定し、再びタイムアウトさせ、持参したreturnBrokenResourceを呼び出さない
[java]
view plain
copy
print
?
jedis jedis = getJedispool().getResource(); try {
jedis.keys("*"); } catch (Exception e) {
e.printStackTrace(); jedis.disconnect();
System.out.println("return already"); }
jedisPool.returnResource(jedis); System.out.println(jedis.ping());
出力PONG
やっと編集が終わりました
誰が最近ずっと問題が発生して、間違いはjedisがデータを追加する時タイプArriylistを返してLong型に変換することができません
しかしよく見ると、saddメソッドの戻りタイプは確かにLong型で、いつリストになったのか
ネット上で探して、同じく同じネットユーザーが同じ問題に出会って、接続のタイムアウトがもたらしたと言って、このように招いたのかどうか分かりませんが、私のコードは確かにタイムアウト異常があります
呼び出し時にcathで異常が発生し、接続プールreturnBrokenResourceを呼び出す方法は次のとおりです.
[java]
view plain
copy
?
Jedis jedis = getJedispool().getResource();
jedis.keys("*");
e.printStackTrace();
System.out.println("return already");
Jedis jedis = getJedispool().getResource();
try {
jedis.keys("*");
} catch (Exception e) {
e.printStackTrace();
jedisPool.returnBrokenResource(jedis);
System.out.println("return already");
}
returnbrokenresourceのブロックが下に行かないことを発見して、それからソースコードを見つけます
JedisPool.java
[java]
view plain
copy
?
public void destroyObject(final Object obj) throws Exception {
final Jedis jedis = (Jedis) obj;
try {
jedis.quit();
}
} catch (Exception e) {
}
}
public void destroyObject(final Object obj) throws Exception {
if (obj instanceof Jedis) {
final Jedis jedis = (Jedis) obj;
if (jedis.isConnected()) {
try {
try {
jedis.quit();
} catch (Exception e) {
}
jedis.disconnect();
} catch (Exception e) {
}
}
}
}
jedisに止まります.quit()これは行かないで、更に中へ行きます
[java]
view plain
copy
?
protected String getStatusCodeReply() {
pipelinedCommands--;
if (null == resp) {
} else {
}
protected String getStatusCodeReply() {
flush();
pipelinedCommands--;
final byte[] resp = (byte[]) protocol.read(inputStream);
if (null == resp) {
return null;
} else {
return SafeEncoder.encode(resp);
}
}
final byte[]resp=(byte[]protocol.read(inputStream)この行
私の能力は限りがあって、本当についていけません
quit()歩けないなら、私はそのまま下へ行きます.
コードを変更してjedisを注記します.直接行くdisconnect()
OK、この接続はやっと正常に接続プールに戻りました
その後接続プール接続数を1に設定し、再びタイムアウトさせ、持参したreturnBrokenResourceを呼び出さない
[java]
view plain
copy
?
jedis jedis = getJedispool().getResource();
jedis.keys("*");
e.printStackTrace();
System.out.println("return already");
jedisPool.returnResource(jedis);
jedis jedis = getJedispool().getResource();
try {
jedis.keys("*");
} catch (Exception e) {
e.printStackTrace();
jedis.disconnect();
System.out.println("return already");
}
jedisPool.returnResource(jedis);
System.out.println(jedis.ping());
出力PONG
やっと編集が終わりました