Hintergrund
Unsere Anwendung verwendet Jedis-2.2.1 und stellt eine Verbindung zu Redis-2.6 her, so erhalte ich die Jedis-Ressource: < /p>
protected static JedisWrapper getRedisUserWrite(String UDID) {
if (redisUserWritePools.get(0) == null) init();
int hash = hash(UDID);
Jedis jedis = redisUserWritePools.get(hash).getResource();
jedis.select(dbs.get("redisUserWritePools" + hash));
return new JedisWrapper(jedis, redisUserWritePools.get(hash));
}
Und das ist mein JedisWrapper(Vereinheitlichung der Ressourcenverwaltung):
public class JedisWrapper {
private Jedis jedis;
private JedisPool pool;
public JedisWrapper(Jedis jedis, JedisPool pool) {
this.jedis = jedis;
this.pool = pool;
}
public Jedis get(){
return this.jedis;
}
public void returnResource() {
if(null != this.jedis){
this.pool.returnResource(this.jedis);
}
}
public void returnBrokenResource() {
if(null != this.jedis) {
this.pool.returnBrokenResource(this.jedis);
}
this.jedis = null;
}
}
JedisWrapper ist der Container der Jedis-Instanz. So verwende ich ihn:
private static void cacheSDKIDs(String UDID, String[] SDKIDs) {
JedisWrapper wrapper = getRedisUserWrite(UDID);
try {
if (SDKIDs != null) {
wrapper.get().del(UDID);
wrapper.get().sadd(UDID, SDKIDs);
}
} catch (JedisConnectionException e) {
e.printStackTrace();
wrapper.returnBrokenResource();
}catch (Exception e) {
e.printStackTrace();
} finally {
wrapper.returnResource();
}
}
Beachten Sie, dass SKDIDs möglicherweise sehr groß sind (z. B. das Maximum von 8 KB erreichen können).
Hier ist das Problem
Jedes Mal, wenn ich unsere Anwendung neu starte, sind alle Redis-Verbindungen normal, aber mehrere Stunden
später konnte keine Ressource aus dem Pool abgerufen werden Ausnahme tritt auf. Und wenn die Frequenz immer höher wird, werden alle Verbindungen zu Redis getrennt und können eine neue Verbindung herstellen.
Hier ist meine Konfiguration:
Ausnahme Stacktrace:
Caused by: redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool
at redis.clients.util.Pool.getResource(Pool.java:40)
at com.xxxice.redis.BaseRedis.getRedisUserWrite(BaseRedis.java:158)
at com.xxx.service.redis.DeviceRedis.cacheSDKIds(DeviceRedis.java:128)
at com.xxx.redis.DeviceRedis.cacheDevice(DeviceRedis.java:65)
at com.xxx.service.DeviceService.update(DeviceService.java:88)
at com.xxx.controller.Devices.update(Devices.java:25)
... 32 more
Caused by: java.util.NoSuchElementException: Timeout waiting for idle object
at org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:1174)
at redis.clients.util.Pool.getResource(Pool.java:38)
... 37 more
Jedis: Es konnte keine Ressource aus dem Pool abgerufen werden ⇐ Java
-
- Similar Topics
- Replies
- Views
- Last post