JedisException:资源作为损坏的资源返回到池中

问题描述

我在Redis客户端上有一些Java代码

Set<String> keys = getKeysByPattern(myKey);
try (Jedis jedis = RedisConnectionFactory.getPool().getResource()) {
    Pipeline pipeline = jedis.pipelined();
    pipeline.multi();
    for (String key : keys) {
        Map<String,String> dataMap = hgetAll(key);

        Map<String,String> dataMapNew = new HashMap<>();
        
        // some codes collect data to dataMapNew ...

        //Update to redis
        if(!dataMapNew.isEmpty()){
            pipeline.del(key);
            pipeline.hmset(key,dataMapNew);
        }
    }
    pipeline.exec();
} catch (Exception ex) {
    log.error(ex.getMessage(),ex);
}

还有我的RedisConnectionFactory班级:

public class RedisConnectionFactory {

    private static final int JEdis_DEFAULT_TIMEOUT = 60000;

    private static JedisPool jedisPool;

    public static void init(String host,int port,String password) {
        jedisPool = new JedisPool(buildPoolConfig(),host,port,JEdis_DEFAULT_TIMEOUT,password);
    }

    // Example config from: https://www.baeldung.com/jedis-java-redis-client-library
    private static JedisPoolConfig buildPoolConfig() {
        final JedisPoolConfig poolConfig = new JedisPoolConfig();
        poolConfig.setMaxTotal(1000);
        poolConfig.setMaxIdle(1000);
        poolConfig.setMinIdle(500);
        poolConfig.setTestOnBorrow(true);
        poolConfig.setTestOnReturn(true);
        poolConfig.setTestWhileIdle(true);
        poolConfig.setMaxWaitMillis(Duration.ofSeconds(10).toMillis());
        poolConfig.setMinevictableIdleTimeMillis(Duration.ofSeconds(60).toMillis());
        poolConfig.setSoftMinevictableIdleTimeMillis(Duration.ofSeconds(120).toMillis());
        poolConfig.setTimeBetweenevictionRunsMillis(Duration.ofSeconds(30).toMillis());
        poolConfig.setNumTestsPerevictionRun(3);
        poolConfig.setBlockWhenExhausted(true);
        return poolConfig;
    }

    static JedisPool getPool() {
        return jedisPool;
    }

当我开始跑步时,出现错误

redis.clients.jedis.exceptions.JedisException: Resource is returned to the pool as broken
        at redis.clients.jedis.JedisPool.returnResource(JedisPool.java:256)
        at redis.clients.jedis.JedisPool.returnResource(JedisPool.java:16)
        at redis.clients.jedis.Jedis.close(Jedis.java:3506)
        at vn.com.ntqsolution.cache.UserRankingCache.updateLastDayDataV2(UserRankingCache.java:415)
        at vn.com.ntqsolution.service.impl.UserRankingServiceImpl.updateLastDayData(UserRankingServiceImpl.java:30)
        at vn.com.ntqsolution.worker.UserRankingRefresher.updateranking(UserRankingRefresher.java:73)
        at vn.com.ntqsolution.worker.UserRankingRefresher.resetRankingCache(UserRankingRefresher.java:51)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:84)
        at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54)
        at org.springframework.scheduling.concurrent.ReschedulingRunnable.run(ReschedulingRunnable.java:93)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:748)
Caused by: redis.clients.jedis.exceptions.JedisConnectionException: java.net.socketTimeoutException: Read timed out
        at redis.clients.util.RedisInputStream.ensureFill(RedisInputStream.java:202)
        at redis.clients.util.RedisInputStream.readByte(RedisInputStream.java:40)
        at redis.clients.jedis.Protocol.process(Protocol.java:153)
        at redis.clients.jedis.Protocol.read(Protocol.java:218)
        at redis.clients.jedis.Connection.readProtocolWithCheckingbroken(Connection.java:341)
        at redis.clients.jedis.Connection.getAll(Connection.java:311)
        at redis.clients.jedis.Connection.getAll(Connection.java:303)
        at redis.clients.jedis.Pipeline.sync(Pipeline.java:99)
        at redis.clients.jedis.Pipeline.clear(Pipeline.java:85)
        at redis.clients.jedis.BinaryJedis.resetState(BinaryJedis.java:1858)
        at redis.clients.jedis.JedisPool.returnResource(JedisPool.java:252)
        ... 20 common frames omitted
Caused by: java.net.socketTimeoutException: Read timed out
        at java.net.socketInputStream.socketRead0(Native Method)
        at java.net.socketInputStream.socketRead(SocketInputStream.java:116)
        at java.net.socketInputStream.read(SocketInputStream.java:171)
        at java.net.socketInputStream.read(SocketInputStream.java:141)
        at java.net.socketInputStream.read(SocketInputStream.java:127)
        at redis.clients.util.RedisInputStream.ensureFill(RedisInputStream.java:196)
        ... 30 common frames omitted

我不知道要解决此问题。谁能帮我吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)