美好的一天,伙计们!
如果我有非事务性bean(BannerSizeServiceUntransact),它使用事务bean(bannerSizeService),当我使用非transacional 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 {
....
}
答案 0 :(得分:1)
是的,即使您使用未标记为@Transactional
的bean,Spring也会建立数据库连接,因此这不是拒绝连接的原因。
在这种情况下会发生的情况是,当您调用bannerSizeService.sizesByType(type)
时,Spring将启动一个新事务,当控制权返回BannerSizeServiceUntransact.sizesByType()
时,它将结束。因此,如果BannerSizeServiceUntransact.sizesByType()
在调用bannerSizeService.sizesByType(type)
之前或之后执行了其他数据库调用,则这些调用将在单独的事务中进行,每个数据库调用一次。 (不将服务注释为@Transactional
并不意味着不使用事务,只是它们只跨越单个数据库调用。)
另请注意,如果调用BannerSizeServiceUntransact.sizesByType()
的方法标记为@Transactional
,那么从那里开始的事务将继承您在此处显示的所有代码,因为该事务将在更高的时候开始-up方法被调用并在它结束时结束,这里的所有代码都将在它生效时执行。不注释某些内容@Transactional
并不禁止其参与现有交易,它只是不需要启动新交易。
另请注意,@Transactional
控制交易。 Spring可能最终为它打开的每个事务建立一个新连接,或者只使用一个并为每个事务重用它,或者通过一个连接池轮换(导致N个事务的连接数超过一个但少于N个)。可以保证,如果Spring与数据库进行通信,则会有一个连接正在使用中,但是您无法保证仅通过@Transactional
注释就可以使用多少N个调用。 (当然,您可以在Spring配置中设置可能影响所用数量的设置,例如指定最大大小为1的连接池。)