sql >> データベース >  >> NoSQL >> Redis

トランザクションがプールへの接続を返さず、使い果たされるとブロックするSpringRedisConnectionFactory

    問題は、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();
        }
    });
    

    SpringDataRedisは@Transactionalもサポートしています これにより、接続が自動的にバインド/アンバインドされますが、インターセプトできるBeanにメソッドを実装する必要があります(つまり、finalにすることはできません)。 )およびトランザクションは、Beanの外部から実行された場合にのみ開始されます(つまり、同じクラスまたはサブ/親クラスの別のメソッドからは実行されません)。

    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に保存する方法(redis-pyを使用)

    2. 流星コレクションのクエリでグループ化

    3. MongoDB-結果セット内の内部配列のコンテンツをフィルタリングする

    4. Node.js + mongoose findは、100を超える結果が発生するとノードをフリーズします