出现错误 redis.clients.jedis.exceptions.JedisException: Could not return the resource to the pool

时间:2024-03-30 20:32:05

 

写代码的时候出现 :redis.clients.jedis.exceptions.JedisException: Could not return the resource to the pool

开始以为是大数据项目,分布式环境pool会不同步,后面发现是jedis对象的问题,在初始化的过程中使用了static关键字,导致

只有一个jedis对象

出现错误 redis.clients.jedis.exceptions.JedisException: Could not return the resource to the pool

 

在代码使用的时候finally关闭 jedis.close()会出现这个错误:出现错误 redis.clients.jedis.exceptions.JedisException: Could not return the resource to the pool

 

最终解决:保证jedis对象不是静态的....不要使用关键字。

 

创建线程池参考:

https://www.cnblogs.com/caimuqing/p/6531161.html

 

package com.scut.emos.nziot_base.redis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
/**
 * Created by CMQ on 2017/3/9.
 */
public class JedisPoolHelper {
    private static JedisPool pool = null;
    public static JedisPool getPool(JedisPoolConfig config,String host,int port) {
        if (pool == null) {
            pool = new JedisPool(config, host, port);
        }
        return pool;
    }
    public void destroyPool(){
        pool.destroy();
    }
}

 

 

 

 

package com.scut.emos.nziot_base;
import com.scut.emos.nziot_base.redis.JedisPoolHelper;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
/**
 * 测试类
 */
public class TestClass {
    private static JedisPool pool = null;
    public TestClass(){
        pool = JedisPoolHelper.getPool(getConfig(),"222.201.145.215",6379);
    }
    public static JedisPoolConfig getConfig(){
        JedisPoolConfig config = new JedisPoolConfig();
        //控制一个pool可分配多少个jedis实例,通过pool.getResource()来获取;
        //如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽)。
        config.setMaxTotal(500);
        //控制一个pool最多有多少个状态为idle(空闲的)的jedis实例。
        config.setMaxIdle(5);
        //表示当borrow(引入)一个jedis实例时,最大的等待时间,如果超过等待时间,则直接抛出JedisConnectionException;
        config.setMaxWaitMillis(1000 * 100);
        //在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的;
        config.setTestOnBorrow(true);
        return config;
    }
    public void sampleUseJedis(){
        Jedis jedis = null;
        try {
            jedis = pool.getResource();
            jedis.set("cdaf","dashuaiguola");
            String str = jedis.get("cai");
        } finally {
            if (jedis != null) {
                jedis.close();
            }
        }
    }
    public static void main(String args[]){

        new TestClass().sampleUseJedis();
        // 1. create log
        Logger log = Logger.getLogger(TestClass.class);
        // 2. get log config file
        PropertyConfigurator.configure("log4j.properties");
        // 3. start log
        log.info("sdfa");

    }
}