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");  
  •         }  
  • 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) {  
  •   

  •                    }  
  •                }  

  •            }  
  •        }  
  •  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);  

  •        }  
  •    }  
  •  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());  
  • 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
     
     
    やっと編集が終わりました