2016-06-27 10 views
2

enableTransactionSupporttrue으로 설정하면 연결이 풀로 반환되지 않습니다. @Transactional 메서드가 완료 되었더라도 연결이 스레드에 바인딩되어 있는데, 이것이 큰 문제입니다. 어떻게 해결합니까? 나는 봄 - 데이터 - 레디 스 2.7.2 및 jedis 2.8.1스프링 데이터 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> 

연결이 내가 enableTransactionSupport를 사용하지 않을 경우이 확인되면, 레디 스 풀에 공개되지를 사용합니다. 그러나 그것을 해결하는 Spring.how의 @Transactional을 지원하지 않습니다?

+0

코드를 게시 하시겠습니까? 고맙습니다. – lrnzcig

+0

안녕하세요. 자신의 질문을 편집하여 모든 정보가 있으며 더 읽기 쉽도록 할 수 있습니다. 댓글을 삭제하면 마치 정보를 잃지 않고 (예 : 설명을 요청하거나 이해하지 못하는 것 등) 댓글을 찍어주세요. 고맙습니다. – lrnzcig

+0

좋아요, 해결하기 위해 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; 
     } 
    } 
관련 문제