java jedis(redis)无法连接
问题描述:
我正尝试在我的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
答
与您的代码的问题是try-与资源块内的调用jedis.close()
。 try-with-resource块在块退出时关闭资源。由于您已关闭资源,因此在退出块之前,最终会关闭两次。
删除块中的jedis.close
调用,并使用try-with-resource功能。
你的proxylink是什么,异常看起来像是由你的代码在proxylink – GuangshengZuo
@Joel Evans引起的,你可以使用这个替代[redission](https://redisson.org/)作为你的项目替代 – kaviranga
@广生Z目前,ProxyLink所做的就是实例化RedisDatabase类。所以它没有办法干涉。 –