2016-06-27 9 views
2

enableTransactionSupporttrueに設定すると、接続はプールに戻されません。 @Transactionalメソッドが終了しても、接続はスレッドにバインドされていますが、これは大きな問題です。どのように解決できますか?私は春-データRedisの2.7.2および2.8.1 jedisスプリングデータRedis enableTransactionSupport接続がプールに戻らない

<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig"> 
    <property name="maxTotal" value="${redis.maxTotal}" /> 
    <property name="maxIdle" value="${redis.maxIdle}" /> 
    <property name="maxWaitMillis" value="${redis.maxWaitMillis}" /> 
    <property name="testOnBorrow" value="${redis.testOnBorrow}" /> 
    <property name="testOnReturn" value="false" /> 
</bean> 

<bean id="jedisFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"> 
    <property name="hostName" value="${redis.host}" /> 
    <property name="port" value="${redis.port}" /> 
    <property name="usePool" value="true" /> 
    <property name="poolConfig" ref="jedisPoolConfig" /> 
</bean> 

<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate"> 
    <property name="connectionFactory" ref="jedisFactory" /> 
    <property name="enableTransactionSupport" value="true" /> 
    <property name="defaultSerializer"> 
    <bean class="com.wd.ics.util.CustomRedisSerializer" /> </property>  
</bean> 

接続iがenableTransactionSupportを使用しない場合、それは大丈夫です、Redisのプールにリリースされていないを使用しています。しかし、それを解決するSpring.howの@Transactionalをサポートしていません?

+0

コードを投稿してください。ありがとうございました。 – lrnzcig

+0

こんにちは。自分の質問を編集して、すべての情報がそこにあるようにすることができます。コメントを削除しても、情報を失うことなく最終的に削除できるかのようにしてください(例:明確化の要請、わからないことなど)。ありがとうございました。 – lrnzcig

+0

ok、私はそれを解決するSessionCallbackを書いている!それはうまくいく、それはすべて、ありがとう。 –

答えて

1

このようにバインド接続をアンバインドすることができます。

RedisConnectionUtils.unbindConnection(redisTemplate.getConnectionFactory()); 

また、jedisを使用している場合。プールへの接続が返されます。

if (pool != null) { 
     if (!broken) { 
      // reset the connection 
      try { 
       if (dbIndex > 0) { 
        jedis.select(0); 
       } 
       pool.returnResource(jedis); 
       return; 
      } catch (Exception ex) { 
       DataAccessException dae = convertJedisAccessException(ex); 
       if (broken) { 
        pool.returnBrokenResource(jedis); 
       } else { 
        pool.returnResource(jedis); 
       } 
       throw dae; 
      } 
     } else { 
      pool.returnBrokenResource(jedis); 
      return; 
     } 
    }