我正在尝试实现批处理编写,以提高特定代码的性能。 现在我已经编写了测试用例,看看当我在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,主]) - 连接 发布到连接池[默认]。
答案 0 :(得分:2)
从日志中看起来每个人都使用新事务来持久保存每个对象,因此每个对象都插入一个单独的事务中,并单独批处理。
您需要先开始一个事务并在事务中保留所有对象。
您还通过执行查询Audit来导致刷新,因此请避免这样做以确保您不必在插入之间进行查询,或者将EntityManager上的flushMode设置为COMMIT。