为了账号安全,请及时绑定邮箱和手机立即绑定

Jedis 池被多次初始化

Jedis 池被多次初始化

慕村9548890 2021-06-12 18:18:40
我在客户redis的帮助下使用jedis。在此处附加键值设置/获取的代码片段。在这里,我希望我jedisPool只初始化一次,但它被初始化多次。不知道我哪里出错了。用它挠我的头几天。我不知道为什么它会进行多次初始化。//$Id$package experiments.with.truth;import redis.clients.jedis.Jedis;import redis.clients.jedis.JedisPool;import redis.clients.jedis.JedisPoolConfig;public class RedisClientUtil {    private static JedisPool pool;                  //I persume the deafult value initialised in my static variable would be null    static int maxActiveConnections = 8;    static int maxWaitInMillis = 2000;    static String host = "127.0.0.1";    static int port = 6379;    static int REDIS_DB = 1;    public static void initRedisClient() throws Exception {        try {            Class classObj = Class.forName("redis.clients.jedis.JedisPool");            if (classObj != null && pool == null) {                JedisPoolConfig jedisConfig = new JedisPoolConfig();                jedisConfig.setMaxTotal(maxActiveConnections);                jedisConfig.setMaxWaitMillis(maxWaitInMillis);                pool = new JedisPool(jedisConfig, host, port);                      System.out.println("Pool initialised successfully !");            }        } catch(ClassNotFoundException ex) {            System.out.println("Couldn't initialize redis due to unavailability of jedis jar in your machine. Exception : " + ex);        }    }    public Jedis getJedisConnection() {        if(pool == null) {            initRedisClient();        }        return pool.getResource();    }    private static void returnJedis(Jedis jedis) {        try {            pool.returnResource(jedis);        } catch(Exception ex) {            ex.printStackTrace();        }    }Pool initialised successfully当我的程序运行时,我可以多次看到这个调试日志。有人可以帮我找到这个漏洞吗?或者我怎样才能通过在整个程序中仅初始化一次来使它更好(或使其按预期行事)。
查看完整描述

1 回答

?
江户川乱折腾

TA贡献1851条经验 获得超5个赞

看起来像一个基本的多线程案例。您的应用程序在短时间内要求 5 个连接。他们都看到 pool==null 并继续初始化它。

简单的解决方案: public static synchronized void initRedisClient() throws Exception {

更新private static volatile JedisPool pool;否则你可能会得到空指针异常。

对于更复杂和高性能的解决方案,请搜索“Java 中的高效惰性单程序”,这很可能会引导您找到Enum解决方案。


查看完整回答
反对 回复 2021-06-23
  • 1 回答
  • 0 关注
  • 161 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信