这是我的绝地工厂

import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

class JedisFactory {
    private static JedisPool jedisPool;
    private static JedisFactory instance;

    public JedisFactory() {
        jedisPool = new JedisPool(getPoolConfig(), "localhost");
    }

    private JedisPoolConfig getPoolConfig() {
        JedisPoolConfig poolConfig = new JedisPoolConfig();
        //poolConfig.setTestOnBorrow(true);
        //poolConfig.setTestOnReturn(true);
        poolConfig.setMaxIdle(2);
// Tests whether connections are dead during idle periods
        //poolConfig.setTestWhileIdle(true);
        poolConfig.setMaxTotal(2);
        //poolConfig.setMaxWaitMillis(120000);
        return poolConfig;
    }

    public JedisPool getJedisPool() {
        System.out.println("get pool");
        return jedisPool;
    }

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

下面是用法:
public static void del(String key) {
        Jedis jedis = JedisFactory.getInstance().getJedisPool().getResource();
        try {
            jedis.del(key);
        } finally {
            JedisFactory.getInstance().getJedisPool().returnResource(jedis);
        }
    }


    public static String ping() {
        Jedis jedis = JedisFactory.getInstance().getJedisPool().getResource();
        try {
            return jedis.ping();
        } finally {
            JedisFactory.getInstance().getJedisPool().returnResource(jedis);
        }
    }
    public static void clear() {
        Jedis jedis = JedisFactory.getInstance().getJedisPool().getResource();
        try {
            jedis.flushAll();
        } finally {
            JedisFactory.getInstance().getJedisPool().returnResource(jedis);
        }
    }

所以,每次操作,我都要输入大量的样板代码。如何避免?

最佳答案

您的jedisfactory.getInstance()工厂方法不是线程安全的。你可以在飞行中拥有多个绝地工厂实例。
如果您使用jdk 7和最新的jedis版本,可以使用try with resource。
尝试(绝地武士=绝地工厂.getInstance().getJedisPool().getResource()){
绝地武士。弗鲁沙尔();
}
以上代码将工作。
因为jedispool是线程安全的,所以您可以初始化jedispool并传递到任何地方。如果您想继续使用jedisfactory,可以通过添加像jedisfactory.getresource()这样的util方法并让getresource()为调用者完成所有工作来最小化代码。既然你创建了绝地工厂,就没有必要向公众公开内部的绝地武士场。

关于java - 与JedisPool的Redis连接池变得过于冗长,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41697363/

10-11 09:30