1

美好的一天,伙计们!

如果我有使用事务性 bean(bannerSizeService) 的非事务性 bean(BannerSizeServiceUntransact),当我使用非事务性 bean 时,Spring 会建立与 DB 的连接吗?(我在日志中有很多被拒绝的 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 {
     ....
}
4

1 回答 1

1

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

在这种情况下会发生的是,当您调用 时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 的连接池。)

于 2013-09-26T21:49:31.187 回答