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);
                    }
                }
            }

 

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM