Джедаи: экземпляры случайным образом подключаются к неправильной базе данныхJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Джедаи: экземпляры случайным образом подключаются к неправильной базе данных

Сообщение Anonymous »

Для библиотеки Java Redis Jedis 5.2.0, согласно источнику, кажется, что getDB() возвращает только локальный кэш текущего Номер базы данных Redis, или, другими словами, то, что клиент Jedis думает, — это номер базы данных, к которой он подключен:

./src/main/java/redis/clients/jedis/Jedis.java:341

Код: Выделить всё

 public int getDB() {
return this.db;
}
... несмотря на то, что API утверждает, что он "возвращает индекс текущей базы данных".
С другой стороны, clientInfo() фактически возвращает информацию о соединении со стороны сервера, т.е. то, что возвращает команда Redis INFO:

./src/main/java/redis/clients/jedis/Jedis.java:8658

Код: Выделить всё

 @Override
public String clientInfo() {
checkIsInMultiOrPipeline();
connection.sendCommand(CLIENT, Keyword.INFO);
return connection.getBulkReply();
}
Поэтому мы используем Scala (с Jetty + Scalatra), а не Java, но это не должно иметь значения. Соединения Jedis заимствованы из пула jPool, инициализированного с помощью URI, содержащего номер базы данных 1 (

Код: Выделить всё

redis://redis1:6379/1
).

Код: Выделить всё

val poolConfig = new JedisPoolConfig()
poolConfig.setTestWhileIdle(true)
poolConfig.setMinEvictableIdleDuration(java.time.Duration.ofSeconds(60))
poolConfig.setTimeBetweenEvictionRuns(java.time.Duration.ofSeconds(30))
poolConfig.setNumTestsPerEvictionRun(-1)
poolConfig.setMaxTotal(32)
val jPool = new JedisPool(poolConfig, new java.net.URI("redis://redis1:6379/1"), 0, 0)
первый раз после запуска приложения оно всегда работает безупречно: заимствованный экземпляр Jedis подключен к базе данных 1. >
Но в дальнейшем довольно часто случается, что заимствованный экземпляр Jedis подключается к базе данных 0.
Итак, когда мы сравниваем getDB() и clientInfo(), например в следующем коде:

Код: Выделить всё

      val rTopic: Jedis = jPool.getResource()
println(s"rTopic.getDB(): ${rTopic.getDB()}")
println(s"rTopic.clientInfo(): ${rTopic.clientInfo()}")

rTopic.select(rTopic.getDB())
Иногда мы получаем:

Код: Выделить всё

rTopic.getDB(): 1
rTopic.clientInfo(): id=90541 addr=172.18.0.4:39664 laddr=172.18.0.2:6379 fd=20 name= age=7 idle=0 flags=N db=0 sub=0 psub=0 ssub=0 multi=-1 qbuf=26 qbuf-free=20448 argv-mem=10 multi-mem=0 rbs=1024 rbp=0 obl=0 oll=0 omem=0 tot-mem=22426 events=r cmd=client|info user=default redir=-1 resp=2 lib-name= lib-ver=
Номер базы данных, возвращаемый getDB(), по-прежнему равен 1, тогда как согласно clientInfo() (см. десятое поле) мы получаем db=0.
Проблема каким-то образом решается добавлением:

Код: Выделить всё

      rTopic.select(rTopic.getDB())
после заимствования экземпляра. Но это не может быть нормальным поведением, не так ли? Тем более, что после первого раза это не постоянно 0, а случайно 0 или 1.
Что может быть причиной этого ? Мы даже понятия не имеем, как это отладить.
Все экземпляры Jedis правильно закрыты (автоматически возвращая соединение в пул).

Подробнее здесь: https://stackoverflow.com/questions/792 ... g-database
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»