起初在JedisPool中配置了50個活動連接,但是程序還是經常報錯:Could not get a resource from the pool
連接池剛開始是這樣配置的:
JedisPoolConfig config = new JedisPoolConfig(); config.setMaxTotal(50); config.setMaxIdle(20); config.setMaxWaitMillis(1000 * 1); config.setTestOnBorrow(true); config.setTestOnReturn(true); JedisPool pool = new JedisPool(config, "10.10.10.167", 6379);
經過測試發現程序的活動連接基本上只有1個,程序剛啟動的時候可能會有2-5個活動的連接,但是過一段時間后就獲取不到第二個活動的連接了。
后來修改為:
JedisPoolConfig config = new JedisPoolConfig(); config.setMaxTotal(200); config.setMaxIdle(50); config.setMinIdle(8);//設置最小空閑數 config.setMaxWaitMillis(10000); config.setTestOnBorrow(true); config.setTestOnReturn(true); //Idle時進行連接掃描 config.setTestWhileIdle(true); //表示idle object evitor兩次掃描之間要sleep的毫秒數 config.setTimeBetweenEvictionRunsMillis(30000); //表示idle object evitor每次掃描的最多的對象數 config.setNumTestsPerEvictionRun(10); //表示一個對象至少停留在idle狀態的最短時間,然后才能被idle object evitor掃描並驅逐;這一項只有在timeBetweenEvictionRunsMillis大於0時才有意義 config.setMinEvictableIdleTimeMillis(60000); JedisPool pool = new JedisPool(config, ip, port, 10000, "密碼", 0);
經過幾個小時的測試,讀取redis了上百萬次再也沒有發生上述錯誤。
在這里進行簡單的猜測:連接池中空閑的連接過一陣子就會自動斷開,但是連接池還以為連接正常,就出現了這個錯誤。
另外,從連接池中獲取連接的時候,可以寫個循環,直到獲取成功才讓出循環。