2017-07-18 23 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。你可以閱讀更多的文檔https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

您可以用例檢查:

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

執行結果:

Before closing 
SubResource closed 
After closing 
+0

哇〜這是驚人的〜我一直想知道如何測試鏈接的資源被關閉,THX很多! – wttttt