Redis
 sql >> база данни >  >> NoSQL >> Redis

Spring RedisConnectionFactory с транзакция, която не връща връзката към пула и след това се блокира при изчерпване

Мисля, че проблемът е в извикването на exec() не казва на шаблона, че всъщност сте приключили с връзката, така че не може да бъде върнат в пула.

Според документите трябва да обвиете кода си в SessionCallback и го изпълнете с RedisTemplate.execute(SessionCallback<T> callback) което ще върне връзката към пула, след като вашето обратно извикване се изпълни.

Като това:

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 също има поддръжка за @Transactional което ще обвърже/развърже връзката автоматично вместо вас, но изисква от вас да внедрите метода в бийн, който може да бъде прихванат (т.е. не може да бъде final ) и транзакциите ще бъдат стартирани само ако се изпълняват извън бина (т.е. не от друг метод в същия клас или под-/родителски клас).

Вече активирате поддръжката на транзакции в шаблона с redisTemplate.setEnableTransactionSupport(true); така че трябва да сте готови:

@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. Трябва ли да споделя Redis връзка между файлове/модули?

  2. Има ли начин за автоматично откриване на нов IP възел на клъстер в Redis Cluster с маруля

  3. Redis - Потребителско име, парола и db?

  4. Как мога да стартирам redis на един сървър на различни портове?

  5. Redis сортирани набори и най-добрият начин за съхранение на uid