gpt4 book ai didi

java - Jedis 池被多次初始化

转载 作者:可可西里 更新时间:2023-11-01 11:15:06 27 4
gpt4 key购买 nike

我在 jedis 客户端的帮助下使用 redis。在此处附加键值设置/获取的代码片段。在这里,我希望我的 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池;否则你可能会得到空指针异常。

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

关于java - Jedis 池被多次初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51632756/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com