Saya pikir masalahnya adalah memanggil exec()
tidak memberi tahu template bahwa Anda benar-benar selesai dengan koneksi sehingga tidak dapat dikembalikan ke kumpulan.
Menurut dokumen Anda seharusnya membungkus kode Anda dalam SessionCallback dan jalankan dengan RedisTemplate.execute(SessionCallback<T> callback)
yang akan mengembalikan koneksi ke kumpulan setelah panggilan balik Anda dijalankan.
Seperti ini:
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 juga memiliki dukungan untuk @Transactional yang akan mengikat/melepaskan koneksi secara otomatis untuk Anda, tetapi mengharuskan Anda untuk menerapkan metode dalam kacang yang dapat dicegat (yaitu tidak bisa final
) dan transaksi hanya akan dimulai jika dieksekusi dari luar bean (yaitu bukan dari metode lain di kelas yang sama atau kelas sub-/induk).
Anda telah mengaktifkan dukungan transaksi pada template dengan redisTemplate.setEnableTransactionSupport(true);
jadi Anda harus baik-baik saja:
@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);
}