2017-07-18 4 views
1

私は混乱しています: 使用法:try(Pipeline pipeline = jedisPool.getResource().pipelined()) パイプラインとjedisインスタンスを閉じますか?またはパイプラインを閉じるだけですか?JedisPoolでチェーンリソースで試してください

私はマルチスレッドでこれを使用していますが、次のようなエラーが出ます。エラーは、JedisPoolのインスタンスが不足しているため(リソースの試行に起因)、デッドロックが発生していることが混乱しています(JedisPoolはマルチスレッドでうまく機能しません)。

sun.misc.Unsafe.park(Native Method) 
java.util.concurrent.locks.LockSupport.park(LockSupport.java:186) 
java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2043) 
org.apache.commons.pool2.impl.LinkedBlockingDeque.takeFirst(LinkedBlockingDeque.java:583) 
org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:442) 
org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:363) 
redis.clients.util.Pool.getResource(Pool.java:49) 
redis.clients.jedis.JedisPool.getResource(JedisPool.java:226) 
io.codis.jodis.RoundRobinJedisPool.getResource(RoundRobinJedisPool.java:214) 

答えて

1

あなたのケースでは、リソースを試してみてください。Pipeline pipeline

MyResourceクラス:

class MyResource implements AutoCloseable { 

    public SubResource getSubResource() { 
     return new SubResource(); 
    } 

    @Override 
    public void close() throws Exception { 
     System.out.println("Resource closed"); 
    } 
} 

SubResourceクラス:

class SubResource implements AutoCloseable{ 
    @Override 
    public void close() throws Exception { 
     System.out.println("SubResource closed"); 
    } 
} 

Mainクラス:

class Main { 

    public static void main(String[] args) { 
     try (SubResource s = new MyResource().getSubResource()) { 
      System.out.println("Before closing"); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     System.out.println("After closing"); 
    } 
} 
あなたは一例でそれを確認することができますドキュメント

https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.htmlで詳細を読むことができます

実行結果:

Before closing 
SubResource closed 
After closing 
+0

すごい〜それは驚くべきことだ〜私はチェーンのリソースをテストする方法を疑問に思ってきたが閉じられ、THXたくさん! – wttttt

関連する問題