没有 JedisPool/commons-pool2-2.0 的 Jedis 缓存实现

Jedis Cache implementation without JedisPool/commons-pool2-2.0

如何在没有 JedisPool/commons-pool2-2.0 的情况下实现 Jedis,因为我们仍在使用 jdk 1.5(commons-pool2-2.0 不支持 JDK 1.5)

如何实现线程安全的连接池?

我不确定 Jedis 与 Java 5 的兼容性。您可以基于旧的 commons-pool 1.6 库创建自己的池。您不需要在通往 运行 jedis 的 class 路径上安装 commons-pool2。我使用 Jedis 2.7.3 和 commons-pool 1.6 来验证解决方法。

查找附加的示例代码:

import org.apache.commons.pool.ObjectPool;
import org.apache.commons.pool.PoolableObjectFactory;
import org.apache.commons.pool.impl.GenericObjectPool;
import redis.clients.jedis.Jedis;

public class JedisWithOwnPooling {

    public static void main(String[] args) throws Exception {

        ObjectPool<Jedis> pool = new GenericObjectPool(new JedisFactory("localhost"));

        Jedis j = pool.borrowObject();
        System.out.println(j.ping());

        pool.returnObject(j);

        pool.close();

    }

    private static class JedisFactory implements PoolableObjectFactory<Jedis> {

        private String host;

        /**
         * Add fields as you need. That's only an example.
         */
        public JedisFactory(String host) {
            this.host = host;
        }

        @Override
        public Jedis makeObject() throws Exception {
            return new Jedis(host);
        }

        @Override
        public void destroyObject(Jedis jedis) throws Exception {
            jedis.close();
        }

        @Override
        public boolean validateObject(Jedis jedis) {
            return jedis.isConnected();
        }

        @Override
        public void activateObject(Jedis jedis) throws Exception {
            if (!jedis.isConnected()) {
                jedis.connect();
            }
        }

        @Override
        public void passivateObject(Jedis jedis) throws Exception {

        }
    }
}