sql >> Base de Datos >  >> NoSQL >> Redis

Spring RedisConnectionFactory con transacción que no devuelve la conexión a Pool y luego se bloquea cuando se agota

Creo que el problema es que llamar a exec() no le dice a la plantilla que realmente ha terminado con la conexión, por lo que no se puede devolver al grupo.

De acuerdo con los documentos, se supone que debes envolver tu código en un SessionCallback y ejecútelo con RedisTemplate.execute(SessionCallback<T> callback) que devolverá la conexión al grupo después de que se haya ejecutado su devolución de llamada.

Así:

template.execute(new SessionCallback<List<Object>>() {
    public List<Object> execute(RedisOperations operations) throws DataAccessException {
        operations.multi();
        aMap.put(A_KEY, a.toString(), a);
        bMap.put(B_KEY, b.toString(), b);
        cMap.put(C_KEY, c.toString(), c);
        return operations.exec();
    }
});

Spring Data Redis también tiene soporte para @Transactional que vinculará/desvinculará la conexión automáticamente por usted, pero requiere que implemente el método en un bean que pueda ser interceptado (es decir, no puede ser final ) y las transacciones solo se iniciarán si se ejecutan desde fuera del bean (es decir, no desde otro método en la misma clase o una clase secundaria/principal).

Ya está habilitando la compatibilidad con transacciones en la plantilla con redisTemplate.setEnableTransactionSupport(true); así que deberías estar listo para irte:

@Transactional
public void put(A a, B b, C c) {
    aMap.put(A_KEY, a.toString(), a);
    bMap.put(B_KEY, b.toString(), b);
    cMap.put(C_KEY, c.toString(), c);
}