记一次Mock100万数据到数据库遇到的问题

本文记录了一次在Mock100万数据到MySQL时遇到的批量插入速度慢的问题。通过Google搜索、加Log和Debug,发现问题是由于内部的慢查询拦截器导致的大量内存复制。解决方案是优化String替换操作,使用Pattern和Matcher提高性能。批量插入能显著减少日志量和解析次数,提高效率,最终成功解决了问题。
摘要由CSDN通过智能技术生成


背景


需要Mock100万数据到数据库。


逐条插入


如果一条一条的插入,模拟1000条,花费了8秒,100万的话,大约花费3个小时,太慢。


批量插入


问题出现

1000条一次进入插入。

consoleLogger.info("This Batch, {}, Time start : {}", batchTotal, s);
orderMapper.batchInsert(orderList);
consoleLogger.info("This Batch, {}, Time elapsed : {}", batchTotal, System.currentTimeMillis() - s);

按照理论,应该比逐条快很多,但是,结果花费了14秒,非常奇怪,开始查找原因。


求助Google

看到两篇有价值的帖子:

http://www.cnblogs.com/aicro/p/3851434.html

http://blog.jobbole.com/85657/

试着改成100条一个批次,很神奇,1000条数据插入,10个循环,总计60毫秒就完成了。难道用MyBatis操作MySQL数据库的批量操作,对于10条一批和1000条一批,性能差别这么大?

不可理解,本着根本上解决问题的思路,继续追根溯源。


加Log

<logger
要使用 `RestTemplate` 调用一个模拟的数据,你可以使用 `MockRestServiceServer` 类来模拟服务端的响应。下面是一个示例代码: ```java import org.springframework.http.HttpMethod; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.test.web.client.MockRestServiceServer; import org.springframework.test.web.client.response.MockRestResponseCreators; import org.springframework.web.client.RestTemplate; public class RestTemplateMockExample { public static void main(String[] args) { // 创建 RestTemplate 实例 RestTemplate restTemplate = new RestTemplate(); // 创建 MockRestServiceServer 实例 MockRestServiceServer mockServer = MockRestServiceServer.createServer(restTemplate); // 模拟服务端的响应 String mockResponse = "{\"message\": \"Hello, World!\"}"; mockServer.expect(MockRestRequestMatchers.requestTo("https://api.example.com/data")) .andExpect(MockRestRequestMatchers.method(HttpMethod.GET)) .andRespond(MockRestResponseCreators.withSuccess(mockResponse, MediaType.APPLICATION_JSON)); // 发送 GET 请求并获取响应 String url = "https://api.example.com/data"; ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.GET, null, String.class); // 处理响应 if (response.getStatusCode().is2xxSuccessful()) { String responseBody = response.getBody(); System.out.println("响应数据:" + responseBody); } else { System.out.println("请求失败,状态码:" + response.getStatusCodeValue()); } // 验证请求是否符合预期 mockServer.verify(); } } ``` 在这个示例中,我们首先创建了一个 `RestTemplate` 的实例,然后使用 `MockRestServiceServer` 创建了一个模拟服务端的实例。 然后,我们使用 `expect` 方法定义了一个期望的请求,并指定了请求的 URL 和 HTTP 方法。使用 `andRespond` 方法定义了服务端的响应,这里我们模拟返回了一个 JSON 格式的响应。 接下来,我们发送一个 GET 请求到模拟的 URL,并获取到响应。最后,我们处理响应并打印出来。 最后,我们使用 `verify` 方法验证请求是否符合预期。 这样就可以使用 `RestTemplate` 调用模拟的数据进行测试或开发。希望对你有所帮助!如果有任何问题,请随时提问。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值