2017-09-04 168 views
1

我正尝试在我的java应用程序中使用Jedis连接到Redis。我正在实例化一个JedisPool对象,当我得到资源时,它会抛出一个异常,说它无法返回资源。奇怪的是,如果我只是实例化一个Jedis对象,它没有问题连接,我可以改变数据。java jedis(redis)无法连接

这里是我的RedisDatabase类:

package me.joeleoli.proxylink.database; 

import me.joeleoli.proxylink.ProxyLink; 
import redis.clients.jedis.Jedis; 
import redis.clients.jedis.JedisPool; 

public class RedisDatabase { 

    private JedisPool pool; 

    public RedisDatabase(String host, int port, String password) { 
     ProxyLink.getInstance().getLogger().info("Attempting to establish Redis connection " + host + ":" + port); 

     this.pool = new JedisPool(host, port); 

     try (Jedis jedis = this.pool.getResource()) { 
      if (password != null && !password.equals("")) { 
       jedis.auth(password); 
      } 

      jedis.select(0); 
      jedis.close(); 
     } 
    } 

    public JedisPool getPool() { 
     return this.pool; 
    } 

} 

这里是我的错误:

22:16:15 [INFO] [ProxyLink] Attempting to establish Redis connection 127.0.0.1:6379 
22:16:15 [WARNING] Exception encountered when loading plugin: ProxyLink 
redis.clients.jedis.exceptions.JedisException: Could not return the resource to the pool 
    at redis.clients.jedis.JedisPool.returnResource(JedisPool.java:106) 
    at redis.clients.jedis.JedisPool.returnResource(JedisPool.java:12) 
    at redis.clients.jedis.Jedis.close(Jedis.java:3206) 
    at me.joeleoli.proxylink.database.RedisDatabase.<init>(RedisDatabase.java:23) 
    at me.joeleoli.proxylink.ProxyLink.onEnable(ProxyLink.java:71) 
    at net.md_5.bungee.api.plugin.PluginManager.enablePlugins(PluginManager.java:227) 
    at net.md_5.bungee.BungeeCord.start(BungeeCord.java:273) 
    at net.md_5.bungee.BungeeCordLauncher.main(BungeeCordLauncher.java:111) 
    at net.md_5.bungee.Bootstrap.main(Bootstrap.java:15) 
Caused by: redis.clients.jedis.exceptions.JedisException: Could not return the resource to the pool 
    at redis.clients.util.Pool.returnResourceObject(Pool.java:61) 
    at redis.clients.jedis.JedisPool.returnResource(JedisPool.java:103) 
    ... 8 more 
Caused by: java.lang.IllegalStateException: Object has already been returned to this pool or is invalid 
    at org.apache.commons.pool2.impl.GenericObjectPool.returnObject(GenericObjectPool.java:551) 
    at redis.clients.util.Pool.returnResourceObject(Pool.java:59) 
    ... 9 more 
+0

你的proxylink是什么,异常看起来像是由你的代码在proxylink – GuangshengZuo

+0

@Joel Evans引起的,你可以使用这个替代[redission](https://redisson.org/)作为你的项目替代 – kaviranga

+0

@广生Z目前,ProxyLink所做的就是实例化RedisDatabase类。所以它没有办法干涉。 –

回答

0

与您的代码的问题是try-与资源块内的调用jedis.close()。 try-with-resource块在块退出时关闭资源。由于您已关闭资源,因此在退出块之前,最终会关闭两次。

删除块中的jedis.close调用,并使用try-with-resource功能。