我正在尝试在Java应用程序中使用Jedis连接到Redis。我正在实例化一个JedisPool对象,当我获得资源时,它抛出一个异常,表明它无法返回资源。但是奇怪的是,如果我仅实例化Jedis对象,它可以毫无问题地连接,并且可以更改数据。

这是我的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

最佳答案

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

删除对块内jedis.close的调用,仅使用try-with-resource功能。

09-12 16:17