web-dev-qa-db-ja.com

ジェディスプールの仕組み

Redisサーバーへの接続を管理するためにJedisプールを使用しています。私のコード例は次のとおりです。

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

問題は、制限された接続の数に達すると、Webにアクセスできなくなることです。私は何か間違っていますか?

30
ipkiss

プールの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 Poolを使用しており、そのパラメーターについてはこちらで読むことができます: GenericObjectPool

38