当前位置: 首页 > 知识库问答 >
问题:

Spring Data Redis enableTransactionSupport连接未返回池

江子石
2023-03-14

当我将enableTransactionSupport设置为true时,连接不会返回到池。即使事务方法已经完成,连接也会绑定到线程,这是一个大问题,如何解决?我使用spring数据redis 2.7.2和jedis 2.8.1

<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>

连接没有释放到redis池,如果我没有使用enableTransactionSupport,这是可以的。但它不支持Spring的Transactional。如何解决?

共有1个答案

终安和
2023-03-14

可以这样解除绑定连接。

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;
        }
    }
 类似资料:
  • 使用来自DBCP的BasicDataSource,如果我们执行getConnection()并且在最后一个块中我们关闭连接,它是真的将连接返回到池还是关闭连接。我正在检查的代码片段是这样的 我正在检查BasicDataSource的源代码,并访问了这个包装类以获取连接。 委托对象的类型为java。sql。联系包装器代码调用委托的close方法,该方法将关闭集合,而不是将连接返回到池。这是DBCP的

  • 问题内容: 我试图在Windows 2008 R2中使用Kibana运行ElasticSearch。 我关注了这篇文章:在带有木瓜的Windows服务器上安装logstash 一步一步,但我得到的是: 当我去 我得到: 因此,似乎ElasticSearch正在运行,但是由于某些原因,Kibana无法连接到它。 ElasticSearch日志包含错误: 知道我在做什么错吗? 问题答案: 我也遇到过类

  • 我正在尝试在同一台机器上设置ElasticSearch、Logstash和Kibana。我设置了: elasticsearch-1.4.0 logstash-1.4.2 kibana-3.1.2 根据本文,我遵循了所有步骤:http://aarvik.dk/a-bit-on-elasticsearch-logstash-kibana-the-elk-stack/ 我运行了ElasticSearch

  • 我想返回每个行,并为和提供空值,如果它们没有。当我执行此查询时,我得到空结果。如果我使用而不是,我得到不正确的结果。如何过滤左连接,以便如果没有匹配,我仍然得到返回的p行与和的空值? 注:我在末尾添加了,仅用于测试目的。

  • 我正在做jndi查找JBOSS AS. Code中配置的数据源,如下所示。 initialContext=新的initialContext(道具); dataSource=(dataSource)initialContext。查找(bundle.getString(“jndiName”); ource.get连接; 这段代码放在servlet的doPost中。我也很安全地打电话给你 联系关闭()

  • 问题内容: 我们看到的情况是,我们的数据库连接由于套接字写入错误而终止: 当然,所有随后的写入连接的尝试都会失败: 在更新代码以捕获此类异常并在发生连接时请求新连接后,该连接再次失败。我是否怀疑每次调用实际上都不在提供新的连接?难道不只是重用已关闭的现有连接吗? 如果我是正确的,那么丢弃旧的连接并请求新的连接的正确方法是什么? 编辑:这是我想知道的更简洁的版本: “ c1 == c2”是正确的说法