在我们的Spring 4项目中,我们希望有涉及Redis和Hibernate的数据库事务.每当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