zoukankan      html  css  js  c++  java
  • JedisConnectionException: java.net.SocketException: Socket closed;Unknown reply: ; It seems like server has closed the connection.解决办法

      最近在使用Jedis pool的时候,写好的servlet程序一经高并发的测试,就会抛出各种Exception,像JedisConnectionException: java.net.SocketException: Socket closed;Unknown reply: ; It seems like server has closed the connection.等等。在网上查了好多资料,很多都说和Redis的timeout的默认设置有关,timeout默认设置是300s,一个redis socket连接超过这个时限,但没有对redis做任何操作的话,redis server就会主动关闭了这个连接。一种解决办法是将timeout设置为0(无限制)就行了。

      由于一些因素,redis一直无法设置然后进行重启。然后我就在timeout=300s的情况下,做了各种尝试,保证既可以使用jedis pool又不会在高并发的时候出错。怪我查找资料不力,一直没有找到解决的办法,只能放弃使用连接池,每次函数调用就new一个jedis对象,然后对redis进行操作。这种方法要注意:jedis.disconnect().这种方式下,虽然在高并发的时候会对redis server造成压力,但很稳定速度也挺快的。

      后来再次试图解决之前的问题的时候,发现Jedis pool 还有两个参数: TestOnBorrow,在borrow一个jedis实例时,是否提前进行validate操作,如果为true,则得到的jedis实例均是可用的;TestOnReturn,在return一个jedis实例时,是否提前进行validate操作.

      设置了这两个参数以后,问题就得到解决了,做并发测试没有什么问题。

        //jedis pool 设置
        public static JedisPool pool;
        static{
            JedisPoolConfig config = new JedisPoolConfig();
            config.setMaxActive(con.getIntValue("redis.maxActive", 300));
            config.setMaxIdle(con.getIntValue("redis.maxIdle", 10));
            //config.setMinIdle(10);
            config.setMaxWait(con.getLongValue("redis.maxWait", 1000L));
            config.setTestOnBorrow(true);
            config.setTestOnReturn(true);
            //config.testWhileIdle=true;
            //config.minEvictableIdleTimeMillis=30000;
            //config.timeBetweenEvictionRunsMillis=30000;
            
            pool = new JedisPool(config, redisaddr, redisport);
        }
                //获取jedis pool 对象
           try{
                    jee= pool.getResource();
                }catch(JedisConnectionException e){
                    pool.returnBrokenResource(jee);
                }
            //读取redis
                if(jee!=null){
                    try{
                        stationList=jee.lrange("trps:lineinfo", 0, -1);
                    } catch (Exception e) {
                        
                        pool.returnBrokenResource(jee);
                    } finally{
                        if(null != jee){
                            pool.returnResource(jee);
                        }
                    }
                }

      

  • 相关阅读:
    第四天——列表(一)
    第十二天—collections模块(十二)
    第十二天——sys模块(十)
    第十二天——os模块(九)
    第十二天——序列化模块(八)
    第十二天——random模块(七)
    第十二天——from ... import ...的使用(三)
    第十二天——import 使用(二)
    vue系列---------vuejs基础学习1.0
    前端随心记---------谈谈开发的工作规范
  • 原文地址:https://www.cnblogs.com/wangzaizhen/p/3465815.html
Copyright © 2011-2022 走看看