JPA:EclipseLink Batch写入不按预期工作

时间:2012-09-18 11:59:02

标签: optimization jpa eclipselink batch-processing

我正在尝试实现批处理编写,以提高特定代码的性能。 现在我已经编写了测试用例,看看当我在eclipse链接中打开批处理时会发生什么。 从日志中看起来,为每个插入语句创建了批处理,这不是我所期望的。 以下是测试用例

@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最佳]:2012-09-18   11:55:56.218 - 的ServerSession(598639019) - 连接(1572163248) - 线程(线程[主,5,主]) - 连接   从连接池[默认]获取。 [EL Finer]:2012-09-18   11:55:56.218 - ClientSession的(1274943796) - 连接(1572163248) - 线程(线程[主,5,主]) - 开始   交易[EL Finer]:2012-09-18   11:55:56.219 - ClientSession的(1274943796) - 连接(1572163248) - 线程(线程[主,5,主]) - 开始   批处理语句[EL Fine]:2012-09-18   11:55:56.22 - ClientSession的(1274943796) - 连接(1572163248) - 线程(线程[主,5,主]) - INSERT   INTO ROUTER_QUANTITY(ROUTER_QUANTITY_ID,ROUTER_PERIOD_ID,评论,   CONTRACT_ID,COUNTER_PARTY,CREATED_BY,CREATED_ON,   FACILITY_COMPONENT_ID,LAST_UPDATED_BY,LAST_UPDATED_ON,MODIFIED,   QUANTITY,QUANTITY_TEMPLATE_ID,SERVICE_ID,SOURCE,STATUS)VALUES(?,   ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)[EL Fine]:2012-09-18   11:55:56.221 - ClientSession(1274943796) - 连接(1572163248) - 线程(线程[main,5,main]) - 绑定   =&GT; [Test8,1,Test,1,Test,user1,2012-09-18 11:55:56.003,PIMTEST,user1,2012-09-18 11:55:56.003,Test,100.1,FM_RES,INJ,Test,Test ]     [EL Finer]:2012-09-18   11:55:56.221 - ClientSession的(1274943796) - 连接(1572163248) - 线程(线程[主,5,主]) - 完   批次陈述[EL Finer]:2012-09-18   11:55:56.435 - 的UnitOfWork(233788733) - 线程(线程[主,5,主]) - 端   工作单位[EL Finer]:2012-09-18   11:55:56.436 - 的UnitOfWork(233788733) - 线程(线程[主,5,主]) - 恢复   工作单位[EL Finest]:2012-09-18   11:55:56.436 - 的UnitOfWork(233788733) - 线程(线程[主,5,主]) - 执行   查询ReadAllQuery(referenceClass = AuditTable sql =&#34; SELECT   AUDIT_TABLE_ID,AUDIT_CREATE,AUDIT_DELETE,AUDIT_READ,AUDIT_UPDATE,   CREATED_BY,CREATED_ON,LAST_UPDATED_BY,LAST_UPDATED_ON,TABLE_NAME   从AUDIT_TABLE WHERE(TABLE_NAME =?)&#34;)[EL Fine]:2012-09-18   11:55:56.44 - ClientSession的(1274943796) - 连接(1572163248) - 线程(线程[主,5,主]) - 选择   AUDIT_TABLE_ID,AUDIT_CREATE,AUDIT_DELETE,AUDIT_READ,AUDIT_UPDATE,   CREATED_BY,CREATED_ON,LAST_UPDATED_BY,LAST_UPDATED_ON,TABLE_NAME   FROM AUDIT_TABLE WHERE(TABLE_NAME =?)bind =&gt; [ROUTER_QUANTITY]     [EL Finer]:2012-09-18   11:55:56.468 - 的UnitOfWork(233788733) - 线程(线程[主,5,主]) - 开始   工作单位[EL Finer]:2012-09-18   11:55:56.469 - ClientSession的(1274943796) - 连接(1572163248) - 线程(线程[主,5,主]) - 犯   交易[EL最佳]:2012-09-18   11:55:56.5 - 的ServerSession(598639019) - 连接(1572163248) - 线程(线程[主,5,主]) - 连接   发布到连接池[默认]。 [EL Finer]:2012-09-18   11:55:56.5 - 的UnitOfWork(233788733) - 线程(线程[主,5,主]) - 端   工作单位[EL Finer]:2012-09-18   11:55:56.5 - 的UnitOfWork(233788733) - 线程(线程[主,5,主]) - 恢复   工作单位[EL Finer]:2012-09-18   11:55:56.501 - 的UnitOfWork(233788733) - 线程(线程[主,5,主]) - 释放   工作单位[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) - 线程(线程[主,5,主]) - 客户机   获得者: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) - 线程(线程[主,5,主]) - 开始   工作单位[EL Finest]:2012-09-18   11:55:56.564 - 的UnitOfWork(1395568819) - 线程(线程[主,5,主]) - 执行   询问   InsertObjectQuery(fm.am.integration.dao.jpa.allocationquantity.AllocationQuantity@23597cac)     [EL最好]:2012-09-18   11:55:56.564 - 的ServerSession(598639019) - 连接(1572163248) - 线程(线程[主,5,主]) - 连接   从连接池[默认]获取。 [EL Finer]:2012-09-18   11:55:56.568 - ClientSession的(1625102195) - 连接(1572163248) - 线程(线程[主,5,主]) - 开始   交易[EL Finer]:2012-09-18   11:55:56.569 - ClientSession的(1625102195) - 连接(1572163248) - 线程(线程[主,5,主]) - 开始   批处理语句[EL Fine]:2012-09-18   11:55:56.569 - ClientSession的(1625102195) - 连接(1572163248) - 线程(线程[主,5,主]) - INSERT   INTO ROUTER_QUANTITY(ROUTER_QUANTITY_ID,ROUTER_PERIOD_ID,评论,   CONTRACT_ID,COUNTER_PARTY,CREATED_BY,CREATED_ON,   FACILITY_COMPONENT_ID,LAST_UPDATED_BY,LAST_UPDATED_ON,MODIFIED,   QUANTITY,QUANTITY_TEMPLATE_ID,SERVICE_ID,SOURCE,STATUS)VALUES(?,   ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)[EL Fine]:2012-09-18   11:55:56.57 - ClientSession(1625102195) - 连接(1572163248) - 线程(线程[main,5,main]) - 绑定   =&GT; [Test2,1,Test,1,Test,user1,2012-09-18 11:55:56.563,PIMTEST,user1,2012-09-18 11:55:56.563,Test,100.1,FM_RES,INJ,Test,Test ]     [EL Finer]:2012-09-18   11:55:56.57 - ClientSession的(1625102195) - 连接(1572163248) - 线程(线程[主,5,主]) - 完   批次陈述[EL Finer]:2012-09-18   11:55:56.571 - 的UnitOfWork(1395568819) - 线程(线程[主,5,主]) - 端   工作单位[EL Finer]:2012-09-18   11:55:56.572 - 的UnitOfWork(1395568819) - 线程(线程[主,5,主]) - 恢复   工作单位[EL Finest]:2012-09-18   11:55:56.572 - 的UnitOfWork(1395568819) - 线程(线程[主,5,主]) - 执行   查询ReadAllQuery(referenceClass = AuditTable sql =&#34; SELECT   AUDIT_TABLE_ID,AUDIT_CREATE,AUDIT_DELETE,AUDIT_READ,AUDIT_UPDATE,   CREATED_BY,CREATED_ON,LAST_UPDATED_BY,LAST_UPDATED_ON,TABLE_NAME   从AUDIT_TABLE WHERE(TABLE_NAME =?)&#34;)[EL Fine]:2012-09-18   11:55:56.572 - ClientSession的(1625102195) - 连接(1572163248) - 线程(线程[主,5,主]) - 选择   AUDIT_TABLE_ID,AUDIT_CREATE,AUDIT_DELETE,AUDIT_READ,AUDIT_UPDATE,   CREATED_BY,CREATED_ON,LAST_UPDATED_BY,LAST_UPDATED_ON,TABLE_NAME   FROM AUDIT_TABLE WHERE(TABLE_NAME =?)bind =&gt; [ROUTER_QUANTITY]     [EL Finer]:2012-09-18   11:55:56.575 - 的UnitOfWork(1395568819) - 线程(线程[主,5,主]) - 开始   工作单位[EL Finer]:2012-09-18   11:55:56.576 - ClientSession的(1625102195) - 连接(1572163248) - 线程(线程[主,5,主]) - 犯   交易[EL最佳]:2012-09-18   11:55:56.611 - 的ServerSession(598639019) - 连接(1572163248) - 线程(线程[主,5,主]) - 连接   发布到连接池[默认]。

1 个答案:

答案 0 :(得分:2)

从日志中看起来每个人都使用新事务来持久保存每个对象,因此每个对象都插入一个单独的事务中,并单独批处理。

您需要先开始一个事务并在事务中保留所有对象。

您还通过执行查询Audit来导致刷新,因此请避免这样做以确保您不必在插入之间进行查询,或者将EntityManager上的flushMode设置为COMMIT。