web-dev-qa-db-fra.com

Comment fonctionne Jedis Pool?

J'utilise le pool Jedis pour gérer les connexions au serveur Redis. Un exemple de mon code comme suit:

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

Code pour créer et récupérer le pool 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;
    }
 }            

Le problème est qu'après avoir atteint le nombre de connexions limitées, le Web n'est plus accessible. Est-ce que je fais quelque chose de mal?

30
ipkiss

Vous n'avez pas configuré la taille maxTotal du pool, et la valeur par défaut est seulement 8. Vous pouvez changer le constructeur JedisFactory en:


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

Méfiez-vous également de la valeur par défaut de WhenExhaustedAction (WHEN_EXHAUSTED_BLOCK), car il peut ne pas s'agir du comportement souhaité.

Jedis utilise Apache Commons Pool, et vous pouvez en lire plus sur ses paramètres ici: GenericObjectPool

38
Alexandre L Telles