1. 程式人生 > >redis提示Could not get a resource from the pool(jedis連線池配置)

redis提示Could not get a resource from the pool(jedis連線池配置)

起初在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了上百萬次再也沒有發生上述錯誤。

在這裡進行簡單的猜測:連線池中空閒的連線過一陣子就會自動斷開,但是連線池還以為連線正常,就出現了這個錯誤。

另外,從連線池中獲取連線的時候,可以寫個迴圈,直到獲取成功才讓出迴圈。