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)場合、それらの呼び出しは、DB 呼び出しごとに 1 つずつ、別々のトランザクションで発生します。( Service に as アノテーションを付け@Transactionalないからといって、トランザクションが使用されないというわけではなく、単一のデータベース呼び出しのみにまたがるというだけです。)

BannerSizeServiceUntransact.sizesByType()また、呼び出すメソッドがマークされている場合、@Transactionalそこで開始されたトランザクションは、ここで示したすべてのコードを引き継ぐことに注意してください。そのトランザクションは、上位のメソッドが呼び出されると開始され、終了すると終了するためです。ここにあるすべてのコードは、有効になっている間に実行されます。既存のトランザクションへの参加を禁止しないため、何かに注釈を付けない@Transactionalでください。新しいトランザクションの開始を必要としないだけです。

また、トランザクション@Transactionalを制御することに注意してください。Spring は、開くトランザクションごとに新しい接続を作成するか、トランザクションごとに 1 つだけを使用して再利用するか、接続のプールをローテーションする (結果として、N トランザクションに対して複数の接続が N 未満になる) 可能性があります。Spring がデータベースと通信する場合、使用中の接続があることが保証されますが、注釈だけでは、N 回の呼び出しで使用される接続の数を保証することはできません。(もちろん、最大サイズ 1 の接続プールを指定するなど、使用される数に影響を与える可能性のある設定を Spring 構成で設定できます。)@Transactional

于 2013-09-26T21:49:31.187 に答える