Redis
 sql >> डेटाबेस >  >> NoSQL >> Redis

लेन-देन के साथ स्प्रिंग RedisConnectionFactory पूल से कनेक्शन वापस नहीं कर रहा है और समाप्त होने पर ब्लॉक कर देता है

मुझे लगता है कि मुद्दा यह है कि exec() calling को कॉल करना टेम्पलेट को यह नहीं बताता कि आपने वास्तव में कनेक्शन के साथ काम किया है, इसलिए इसे पूल में वापस नहीं किया जा सकता है।

दस्तावेज़ों के मुताबिक आपको अपना कोड 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();
    }
});

स्प्रिंग डेटा रेडिस को @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. जटिल डेटा संरचनाएं रेडिस

  2. उबंटू पर रेडिस को स्थापित और कॉन्फ़िगर करना

  3. Laravel या Redis में कतारबद्ध नौकरी कैसे रद्द करें?

  4. 127.0.0.1:6379 पर Redis से कनेक्ट नहीं हो सका:कनेक्शन अस्वीकृत

  5. कोडइग्निटर में रेडिस को कैसे कार्यान्वित करें?