sql >> Database teknologi >  >> NoSQL >> Redis

Spring RedisConnectionFactory med transaktion, der ikke returnerer forbindelse til Pool og blokerer derefter, når den er opbrugt

Jeg tror, ​​problemet er at kalde exec() fortæller ikke skabelonen, at du faktisk er færdig med forbindelsen, så den kan ikke returneres til poolen.

Ifølge dokumenterne skal du pakke din kode ind i et SessionCallback og kør det med RedisTemplate.execute(SessionCallback<T> callback) som vil returnere forbindelsen til poolen efter dit tilbagekald er udført.

Sådan:

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 også understøttelse af @Transactional som binder/afbinder forbindelsen automatisk for dig, men kræver, at du implementerer metoden i en bean, der kan opsnappes (dvs. den kan ikke være final ) og transaktioner vil kun blive startet, hvis de udføres uden for bean (dvs. ikke fra en anden metode i samme klasse eller en under-/overordnet klasse).

Du aktiverer allerede transaktionssupport på skabelonen med redisTemplate.setEnableTransactionSupport(true); så du burde være god til at 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 Connection via socket på Node.js

  2. Hvad er den rigtige måde at lave en synkron MongoDB-forespørgsel i Node.js?

  3. MongoDB $rækkevidde

  4. Hvordan øger man rigtig mange datoer i mongoDB?