2014-01-20 34 views
19

私はredisサーバーへの接続を管理するためにjedisプールを使用しています。次のように私のコード例:Jedis Poolの仕組みは?

public Set<String> getTopArticleList(int start, int end) { 
     Set<String> list = null; 
     Jedis j = JedisFactory.getInstance().getJedisPool().getResource(); 
     Pipeline pipe = j.pipelined(); 
     try { 
      // do stuff with redis 
      pipe.sync(); 
     } catch (JedisConnectionException jex) { 
      JedisFactory.getInstance().getJedisPool().returnBrokenResource(j); 
     } finally { 
      JedisFactory.getInstance().getJedisPool().returnResource(j); 
     } 

     return list; 
    } 

とコードjedisを取得するためには、問題が限定された接続数に達した後、ウェブはもうアクセスできないことである

class JedisFactory { 
     private static JedisPool jedisPool; 
     public JedisFactory() { 
      JedisPoolConfig poolConfig = new JedisPoolConfig(); 
      jedisPool = new JedisPool(
       poolConfig, 
       RedisDBConfig.HOST, 
       RedisDBConfig.PORT, 
       RedisDBConfig.TIMEOUT, 
       RedisDBConfig.PASSWORD 
     ); 
     } 

     public JedisPool getJedisPool() { 
      return jedisPool; 
     } 

     public static JedisFactory getInstance() { 
      if (instance == null) { 
       instance = new JedisFactory(); 
      } 
      return instance; 
     } 

をプール。私は何か間違っているのですか?

+0

はあなたがJedisFactoryの全体のコードを追加することはできますか?特にgetInstance()implとgetJedisPool()? – zenbeni

+0

JedisFactoryの完全なコードを追加しました – ipkiss

+0

2つ以上のスレッドを使用していますか?マルチスレッドの問題ですか? – zenbeni

答えて

26

あなたがプールのmaxTotalサイズを設定していない、とデフォルト値は唯一の8です。あなたがにJedisFactoryコンストラクタを変更することができます:


    public JedisFactory() { 
     JedisPoolConfig poolConfig = new JedisPoolConfig(); 
     poolConfig.setMaxTotal(128); 
     jedisPool = new JedisPool(poolConfig, RedisDBConfig.HOST, RedisDBConfig.PORT, RedisDBConfig.TIMEOUT, RedisDBConfig.PASSWORD); 
    } 

のデフォルト値のにも注意してくださいWhenExhaustedAction(WHEN_EXHAUSTED_BLOCK)、あなたの希望する動作ではない可能性があります。

Jedisは、Apache Commonsのプールを使用して、あなたはここでのパラメータについて読むことができます。GenericObjectPool

+1

JedisPoolConfigパラメータについて言及している文書はありますか?私は検索しようとしましたが、説明のない関数apiのリストを取得しました。たとえば、「WhenExhaustedAction」は何をしたいのですか? – ipkiss

+1

JedisPoolConfigにsetMaxActiveはありません。これはコンパイルされません。 – JohnMerlino

+3

@JohnMerlinoあなたが正しいです、Jedisの最新バージョンでは、彼らはコモンズプールをバージョン2.Xに変更しました。新しいメソッドはsetMaxTotal()と呼ばれ、すぐに回答が更新されます。 –