java_高并发之接口性能调优之大事务优化

接口性能调优之大事务优化

先来看一段代码

@Transactional
public void bigTransaction() throws InterruptedException {
    // 1、getData()方法模拟一个比较耗时的获取数据的操作,这个方法内部会休眠5秒
    String data = this.getData();

    //2、将上面获取到的数据写入到db中
    Lesson007PO po = new Lesson007PO();
    po.setId(UUID.randomUUID().toString());
    po.setData(data);
    this.lesson007Mapper.insert(po);
}

public String getData() throws InterruptedException {
    //休眠5秒
    TimeUnit.SECONDS.sleep(5);
    return UUID.randomUUID().toString();
}

上面这段代码没有没有什么问题?

明眼人可能已经看出来了,方法上加了@Transactional注解,加了这个注解,说明这个方法会交给Spring来自动管理这个方法的事务,那么这个方法的逻辑就变成了下面这样

1、Spring去数据库连接池拿到一个数据库连接
2、开启事务
3、执行bigTransaction()中的代码
4、提交事务
5、将数据库连接还给数据库连接池中

这整个过程中,这个连接都会被占用,数据库连接都是有上限的,是非常稀缺的资源,如果所有人都把连接拿去使用很久而没有释放,那么当连接池里面的连接都被拿走了去使用,此时其他请求就没有数据库连接可以使用了,从而导致无法从连接池中获取有效的连接,会导致获取连接超时,而导致请求失败。

有没有什么优化方案?(小事务化)

上面的写法也就是我们常说的大事务,有很大的优化空间。

优化方案:将事务最小化,再来看看这段代码,如下,其实getData()方法中是用不到数据库操作的,这个方法里面并没有数据库操作,只有最后的insert才会用到数据库操作,会向db中写入数据,这个时候才会用到数据库的连接,那么我们能不能把这个

你可能感兴趣的:(Java,高并发,接口性能调优之大事务优化)