gpt4 book ai didi

java - 当我在非事务中使用事务bean时,Spring会建立与数据库的连接吗?

转载 作者:太空宇宙 更新时间:2023-11-04 07:22:53 24 4
gpt4 key购买 nike

大家好!

如果我有非事务性bean(BannerSizeServiceUntransact),它使用事务性bean(bannerSizeService),当我使用非事务性bean时,Spring会建立与数据库的连接吗?(我在日志中有许多与 PostgreSQL 的拒绝连接。我相信我的逻辑不会在每个请求上创建新连接,但可能是我错了。)

@Repository
public class BannerSizeServiceUntransactImpl implements BannerSizeServiceUntransact {

@Resource
BannerSizeService bannerSizeService;


public List<BannerSizeVO> sizesByType(String type) throws BannerServiceException{
return bannerSizeService.sizesByType(type);

} }


@Repository
@Transactional
public class BannerSizeServiceImpl implements BannerSizeService {
....
}

最佳答案

是的,即使您使用未标记为@Transactional的bean,Spring也会建立数据库连接,因此这不是连接被拒绝的原因。

在这种情况下会发生的情况是,当您调用 bannerSizeService.sizesByType(type) 时,Spring 将启动一个新事务,当控制权返回到 BannerSizeServiceUntransact.sizesByType() 时,它将结束。因此,如果 BannerSizeServiceUntransact.sizesByType() 在调用 bannerSizeService.sizesByType(type) 之前或之后执行其他数据库调用,这些调用将在单独的事务中发生,每个数据库调用一个。 (不将服务注释为@Transactional并不意味着不使用事务,只是它们只跨越单个数据库调用。)

另请注意,如果调用 BannerSizeServiceUntransact.sizesByType() 的方法被标记为 @Transactional,那么在那里启动的事务将继承您在此处显示的所有代码,因为该事务将在调用更高层方法时启动,并在其结束时结束,并且此处的所有代码都将在其生效时执行。不将某些内容注释为 @Transactional 并不禁止其参与现有事务,只是不需要启动新事务。

此外,请记住,@Transactional 控制交易。 Spring最终可能会为其打开的每个事务创建一个新连接,或者仅使用一个连接并为每个事务重用它,或者在连接池中轮换(导致 N 个事务的连接多于一个但少于 N 个)。可以保证,如果 Spring 与数据库通信,就会有一个连接正在使用中,但您无法仅通过 @Transactional 注解来保证 N 次调用中将使用多少个连接。 (当然,您可以在 Spring 配置中设置可能影响使用数量的设置,例如指定最大大小为 1 的连接池。)

关于java - 当我在非事务中使用事务bean时,Spring会建立与数据库的连接吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19039151/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com