sql >> Databáze >  >> NoSQL >> Redis

Spring RedisConnectionFactory s transakcí, která nevrací připojení k fondu a po vyčerpání se zablokuje

Myslím, že problém je ve volání exec() neříká šabloně, že jste skutečně s připojením skončili, takže jej nelze vrátit do fondu.

Podle dokumentů byste měli kód zabalit do SessionCallback a spusťte jej pomocí RedisTemplate.execute(SessionCallback<T> callback) která vrátí připojení k fondu po provedení zpětného volání.

Takhle:

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 má také podporu pro @Transactional který za vás automaticky sváže/odpojí připojení, ale vyžaduje, abyste implementovali metodu do beanu, který může být zachycen (tj. nemůže být final ) a transakce budou zahájeny pouze v případě, že budou provedeny mimo objekt bean (tj. ne z jiné metody ve stejné třídě nebo v podřízené/nadřazené třídě).

Podporu transakcí v šabloně již povolujete pomocí redisTemplate.setEnableTransactionSupport(true); takže byste měli jít:

@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. Nelze vytvořit funkční projekt meteor.js na tulákovské krabici

  2. Java+Redis vs efektivita Java pro datově náročné aplikace?

  3. Meteor vrací chybu neplatného hexadecimálního řetězce při pokusu o vytvoření ObjectID?

  4. Oznámení Redis Keyspace s flushdb