簡體   English   中英

Jedis池被多次初始化

[英]Jedis pool is initialised multiple times

我使用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();
        }
    }
    public static String getValue(String key) throws Exception{
        Jedis jedisCon = null; 
        try {
            jedisCon = getJedisConnection();
            jedisCon.select(REDIS_DB);

            String val = jedisCon.get(key); 
            return val;
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (jedisCon != null) {
                returnJedis(jedisCon);
            }
        }
        return null;
    }
    public void addValueToRedis(String key, String value) {
        Jedis jedisCon = null; 
        try {
            jedisCon = getJedisConnection();
            jedisCon.select(REDIS_DB);

            jedisCon.set(key, value); 
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (jedisCon != null) {
                returnJedis(jedisCon);
            }
        }
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        System.out.println("Value : " + getValue("a"));
        System.out.println("Value : " + getValue("b"));
        System.out.println("Value : " + getValue("c"));
    }
}

我的程序運行時,我可以多次看到此調試日志Pool initialised successfully 有人可以幫我找到這個漏洞嗎? 或者如何通過在整個程序中僅初始化一次來使它更好(或使其表現出預期的效果)。

看起來像一個基本的多線程案例。 您的應用要求在短時間內建立5個連接。 他們所有人都看到pool == null並進行初始化。

簡單的解決方案: public static synchronized void initRedisClient() throws Exception {

更新private static volatile JedisPool pool; 否則,您可能會得到空指針異常。

對於更復雜,性能更高的解決方案,請搜索“ java中的高效懶惰單例”,這很可能會導致您使用Enum解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM