sql >> Databasteknik >  >> NoSQL >> Redis

Spring RedisConnectionFactory med transaktion som inte returnerar anslutning till Pool och blockerar sedan när den är slut

Jag tror att problemet är att anropet exec() berättar inte för mallen att du faktiskt är klar med anslutningen så att den inte kan returneras till poolen.

Enligt dokumenten ska du slå in din kod i en SessionCallback och kör det med RedisTemplate.execute(SessionCallback<T> callback) som kommer att returnera anslutningen till poolen efter att din återuppringning har utförts.

Så här:

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 har också stöd för @Transactional som binder/avbinder anslutningen automatiskt åt dig, men kräver att du implementerar metoden i en böna som kan avlyssnas (dvs. den kan inte vara final ) och transaktioner kommer endast att startas om de exekveras utanför beanen (dvs. inte från en annan metod i samma klass eller en under-/förälderklass).

Du aktiverar redan transaktionsstöd på mallen med redisTemplate.setEnableTransactionSupport(true); så du borde vara bra att gå:

@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);
}



  1. Redis:möjligt att förfalla ett element i en array eller sorterad uppsättning?

  2. MongoDB hämta SubDocument

  3. zmq vs redis för pub-sub-mönster

  4. Python och MongoDB:Ansluter till NoSQL-databaser