Redis
 sql >> Baza danych >  >> NoSQL >> Redis

Spring RedisConnectionFactory z transakcją nie zwraca połączenia do puli, a następnie blokuje po wyczerpaniu

Myślę, że problem polega na tym, że wywołanie exec() nie informuje szablonu, że połączenie zostało zakończone, więc nie może zostać zwrócone do puli.

Zgodnie z dokumentacją powinieneś umieścić swój kod w SessionCallback i wykonaj go za pomocą funkcji RedisTemplate.execute(SessionCallback<T> callback) który zwróci połączenie do puli po wykonaniu wywołania zwrotnego.

Tak:

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 obsługuje również @Transactional który automatycznie zwiąże/rozwiąże połączenie, ale wymaga zaimplementowania metody w bean, który może zostać przechwycony (tzn. nie może być final ).

Włączasz już obsługę transakcji w szablonie za pomocą redisTemplate.setEnableTransactionSupport(true); więc powinieneś być gotowy:

@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
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Jak mogę usunąć obiekty z Redis, które są dodawane w czasie rzeczywistym?

  2. Jak zastosować warunek „LUB” w poleceniu klawiszy redis

  3. Spring Boot z błędem serializacji sesji/Redis ze złymi poświadczeniami Active Directory Ldap

  4. Zablokuj dostęp do klucza Redis (ServiceStack)

  5. Funkcja transmisji socket.io i architektura Redis pub/sub