2012-10-24 54 views
13

我運行多個工作線程(約10)的資源從Redis的問:
訪問數據對於我使用infinte超時Jedis客戶無法從池中獲取(SocketTimeoutException :)

Jedis jedis = pool.getResource(); 
jedis.getClient().setTimeoutInfinite(); 

我依然收到錯誤「無法從池中獲取的資源」。堆棧跟蹤如下。

redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool 
at redis.clients.util.Pool.getResource(Pool.java:22) 
at Workers.Worker1.met1(Worker1.java:124) 
at Workers.Worker1.work(Worker1.java:108) 
at org.gearman.impl.worker.WorkerConnectionController$3.run(Unknown Source) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
at java.lang.Thread.run(Unknown Source) 

Caused by: redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketTimeoutException: connect timed out 
at redis.clients.jedis.Connection.connect(Connection.java:124) 
at redis.clients.jedis.BinaryClient.connect(BinaryClient.java:54) 
at redis.clients.jedis.BinaryJedis.connect(BinaryJedis.java:1657) 
at redis.clients.jedis.JedisPool$JedisFactory.makeObject(JedisPool.java:63) 
at org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:1188) 
at redis.clients.util.Pool.getResource(Pool.java:20) 
... 6 more 

Caused by: java.net.SocketTimeoutException: connect timed out 
at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method) 
at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source) 
at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source) 
at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source) 
at java.net.AbstractPlainSocketImpl.connect(Unknown Source) 
at java.net.PlainSocketImpl.connect(Unknown Source) 
at java.net.SocksSocketImpl.connect(Unknown Source) 
at java.net.Socket.connect(Unknown Source) 
at redis.clients.jedis.Connection.connect(Connection.java:119) 
... 11 more 
+0

你的Redis服務器還活着嗎?你能使用redis-cli從客戶端連接到它嗎? –

+0

是的Redis服務器是活着的並且能夠使用redis-cli – Vignesh

+1

進行連接我有同樣的問題。 Redis正在運行。使用JedisPool時會出現問題,並執行'returnResource'。 Jedis jedis = new Jedis(「localhost」);'沒問題。你解決了這個問題嗎? –

回答

1

不確定,但也許您不會將Jedis對象返回到池中,並且您的redis服務器具有連接限制。

每個工作線程應該返回Jedis實例池的工作完成後:

Jedis jedis = jedisPool.getResource(); 
try { 
    jedis.getClient().setTimeoutInfinite(); 
    // your code here... 
    ... 
} finally { 
    jedisPool.returnResource(jedis); 
} 
+0

是@Jarek,我已經返回資源。 \t ** pool.returnResource(jedis); 池。destroy(); ** – Vignesh

+0

在我的Java應用程序中,我使用的是Jedis2.0.0.jar文件,而redis服務器版本是2.4.13。它是否造成問題? – Vignesh

4

我注意到,此異常,將Redis的,如果沒有運行異常。只是一個頭。

1

如果你的代碼是這樣的:

JedisPoolConfig jedisPoolConfig = initPoolConfig();  
jedisPool = new JedisPool(jedisPoolConfig, "*.*.*.*", 6379); 

你可以試試這個:

JedisPoolConfig jedisPoolConfig = initPoolConfig();  
jedisPool = new JedisPool(jedisPoolConfig, "*.*.*.*", 6379,10*1000); 

這是因爲Redis的默認的超時時間爲2秒,但該程序可能運行完畢在這段時間。

2

根據Rick Hanlon的回答,如果在Spring Boot中使用Redis,也會拋出此異常。

如果您使用的是Spring Boot,只需要Redis的依賴關係;你還需要關閉Bash終端的手動下載和redis.io您的計算機上安裝的Redis,然後運行它:

[email protected]_pc:/path/to/redis/dir$ ./src/redis-server ./redis.conf 

運行服務器後,您將需要添加相關線路中所有的應用程序,使用Redis的:

application.properties

... 
spring.redis.host: <yourhost> // usually localhost, but can also be on a LAN 
spring.redis.port: <yourport> // usually 6379, but settable in redis.conf 

application.yml

... 
spring: 
    redis: 
    host: <yourhost> // usually localhost, but can also be on a LAN 
    port: <yourport> // usually 6379, but settable in redis.conf 
0

它總是或偶爾發生?如果偶爾,您可能需要檢查連接池的大小。

默認連接池大小(如果使用的是JedisPoolConfig)爲8。對於你的情況,這可能太小了。

JedisPoolConfig poolConfig = new JedisPoolConfig(); 
poolConfig.setMaxTotal(128); 
jedisPool = new JedisPool(poolConfig, HOST, PORT, ...);