0

特定のコードのパフォーマンスを向上させるために、バッチ書き込みを実装しようとしています。今、私はテストケースを作成して、日食リンクでのバッチ書き込みをオンにしたときに何が起こるかを確認しました。ログから、そのバッチが挿入ステートメントごとに作成されているように見えますが、これは私が期待したものではありません。以下はテストケースです

@Test
    public void test_batchCreateRouters(){
        List<RouterDTO> routerDTOList = new ArrayList<RouterDTO>();
        IRouterService iRouterService = (IRouterService) ctx.getBean("routerService");
        build_DTO("Test8",routerDTOList);
        build_DTO("Test2",routerDTOList);
        build_DTO("Test3",routerDTOList);
        build_DTO("Test4",routerDTOList);
        build_DTO("Test5",routerDTOList);
        build_DTO("Test6",routerDTOList);
        build_DTO("Test7",routerDTOList);
        for(RouterDTO routerDTO:routerDTOList) {
            iRouterService.createRouter(routerDTO);
        }
    }

build_DTOはDTOにデータを入力し、リストを追加するだけです。createRouterはいくつかの検証を行い、以下のコードを実行します。

try {
    getJpaTemplate().persist(entity);    
    } catch (RuntimeException re) {
throw re;}.

しかし、ログを確認すると、以下のようになります。これは、挿入ごとに新しいバッチが作成されることを示しています。誰かがこれについて何か考えを持っているか、私に正しい場所を導くことができます。

[EL Finest]:2012-09-18 11:55:56.218--ServerSession(598639019)--Connection(1572163248)--Thread(Thread [main、5、main])--接続プールから取得した接続[デフォルト] 。[EL Finer]:2012-09-18 11:55:56.218--ClientSession(1274943796)--Connection(1572163248)--Thread(Thread [main、5、main])-トランザクションを開始[EL Finer]:2012 -09-18 11:55:56.219--ClientSession(1274943796)--Connection(1572163248)--Thread(Thread [main、5、main])-バッチステートメントの開始[EL Fine]:2012-09-18 11 :55:56.22--ClientSession(1274943796)--Connection(1572163248)--Thread(Thread [main、5、main])--INSERT INTO ROUTER_QUANTITY(ROUTER_QUANTITY_ID、ROUTER_PERIOD_ID、COMMENTS、CONTRACT_ID、COUNTER_PARTY、CREATED_BY、CREATED_ON、FACIL 、LAST_UPDATED_BY、LAST_UPDATED_ON、MODIFIED、QUANTITY、QUANTITY_TEMPLATE_ID、SERVICE_ID、SOURCE、STATUS)VALUES(?、?、?、5--ServerSession(598639019)--Connection(1572163248)--Thread(Thread [main、5、main])--接続が接続プールに解放されました[デフォルト]。[EL Finer]:2012-09-18 11:55:56.5--UnitOfWork(233788733)--Thread(Thread [main、5、main])-作業ユニットのコミットを終了[EL Finer]:2012-09- 18 11:55:56.5--UnitOfWork(233788733)--Thread(Thread [main、5、main])--作業単位を再開[EL Finer]:2012-09-18 11:55:56.501--UnitOfWork( 233788733)--Thread(Thread [main、5、main])--作業単位の解放[EL Finer]:2012-09-18 11:55:56.501--ClientSession(1274943796)--Thread(Thread [main、 5、main])-クライアントがリリースされました[EL Finer]:2012-09-18 11:55:56.502--ServerSession(598639019)--Thread(Thread [main、5、main])--クライアントが取得されました:1625102195 [ EL Finer]:2012-09-18 11:55:56.502--ClientSession(1625102195)--Thread(Thread [main、5、main])-作業単位を取得します:1395568819 [EL Finest]:2012-09-18 11:55:56.563--UnitOfWork(1395568819)--Thread(Thread [main、5、main])--persist()操作が呼び出されました:fm.am.integration。 dao.jpa.allocationquantity.AllocationQuantity@23597cac。[EL Finer]:2012-09-18 11:55:56.563--UnitOfWork(1395568819)--Thread(Thread [main、5、main])-作業単位のフラッシュを開始[EL Finest]:2012-09- 18 11:55:56.564--UnitOfWork(1395568819)--Thread(Thread [main、5、main])--クエリの実行InsertObjectQuery(fm.am.integration.dao.jpa.allocationquantity.AllocationQuantity@23597cac)[EL Finest ]:2012-09-18 11:55:56.564--ServerSession(598639019)--Connection(1572163248)--Thread(Thread [main、5、main])--接続プールから取得した接続[デフォルト]。[EL Finer]:2012-09-18 11:55:56.568--ClientSession(1625102195)--Connection(1572163248)--Thread(Thread [main、5、

4

1 に答える 1

2

ログから、それぞれが新しいトランザクションを使用して各オブジェクトを永続化しているように見えるため、各オブジェクトは個別のトランザクションと個別のバッチに挿入されます。

最初にトランザクションを開始し、トランザクション内のすべてのオブジェクトを永続化する必要があります。

また、クエリAuditを実行してフラッシュを引き起こしているため、挿入の間にクエリを実行しないようにするか、EntityManagerのflushModeをCOMMITに設定してください。

于 2012-09-18T12:31:46.303 に答える