मुझे लगता है कि मुद्दा यह है कि 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);
}