小编Awe*_*lte的帖子

启用事务支持时是否未正确释放spring-data-redis连接?

在我们的Spring 4项目中,我们希望有涉及Redis和Hibernate的数据库事务.每当Hibernate失败时,例如由于乐观锁定,Redis事务也应该中止.

这似乎有用

  1. 单线程事务执行.
  2. 多线程事务执行,只要事务只包含一个Redis调用.
  3. 如果从我们的配置中排除Hibernate,则使用多个Redis调用执行多线程事务.

一旦事务包含多个Redis调用,并且Hibernate配置为参与事务,连接绑定和多线程似乎就会出现问题.线程被卡住RedisConnectionUtils.bindConnection(),可能是因为JedisPool连接耗尽.

这可以如下再现.

@Service
public class TransactionalService {

    @Autowired
    @Qualifier("redisTemplate")
    private RedisTemplate<String, Object> redisTemplate;

    @Transactional
    public void processTask(int i){

        redisTemplate.convertAndSend("testChannel", new Message());
        redisTemplate.convertAndSend("testChannel", new Message());
    }
}
Run Code Online (Sandbox Code Playgroud)

我们使用ThreadPoolTaskExecutor核心池大小为50来模拟多线程事务.

@Service
public class TaskRunnerService {

    @Autowired
    private TaskExecutor taskExecutor;

    @Autowired
    private TransactionalService transactionalService;

    public void runTasks() {

        for (int i = 0; i < 100; i++) {

            final int j = i;

            taskExecutor.execute(new Runnable() {

                @Override
                public void run() {
                    transactionalService.processTask(j); …
Run Code Online (Sandbox Code Playgroud)

multithreading transactions redis spring-data spring-data-redis

7
推荐指数
1
解决办法
2886
查看次数