如何使用MySQL处理Spring Boot中重复的多次插入?
我目前正在构建一个通过socket.io不断接收XML消息的应用程序 我的应用程序一收到XML消息,就会将XML解析为Java实体对象并保存它 进入MySQL数据库 我的服务器的当前规范如下所示 CPU:24核 内存:16 GB 存储:128GB(SSD) 问题是,无论我如何重构代码或实现批插入 事务之间发生延迟,导致内存泄漏 下面是我的部分代码和application.yml设置 如有任何建议,我将不胜感激 谢谢如何使用MySQL处理Spring Boot中重复的多次插入?,mysql,spring,spring-boot,Mysql,Spring,Spring Boot,我目前正在构建一个通过socket.io不断接收XML消息的应用程序 我的应用程序一收到XML消息,就会将XML解析为Java实体对象并保存它 进入MySQL数据库 我的服务器的当前规范如下所示 CPU:24核 内存:16 GB 存储:128GB(SSD) 问题是,无论我如何重构代码或实现批插入 事务之间发生延迟,导致内存泄漏 下面是我的部分代码和application.yml设置 如有任何建议,我将不胜感激 谢谢 @Async @EventListener(ApplicationReadyEv
@Async
@EventListener(ApplicationReadyEvent.class)
public void listenInPlay() {
if(allow) {
try {
IO.Options options = new IO.Options();
options.transports = new String[]{"websocket"};
options.reconnectionAttempts = 2;
options.reconnectionDelay = 1000;
options.timeout = 500;
String id = getHashByIp("ibin" + myIpAddress + "ibin");
final Socket socket = IO.socket(url + ":" + inPlayPort + "?userId=" + id, options);
socket.on("push_data_event", objects -> runRunnable(objects[0].toString()));
socket.connect();
} catch (Exception e) {
e.printStackTrace();
}
}
}
这一部分启动套接字客户端,并在接收到消息时将其传递给处理函数
public void handleMessage(String rawLSportsMessage) {
try{
//System.out.println("InPlayMessage:----------------\n" + rawLSportsMessage);
LSportsMessage obj = xmlMapper.readValue(rawLSportsMessage, LSportsMessage.class);
lSportsMessages.add(obj);
if(lSportsMessages.size() >= 100){
insertMessage(lSportsMessages);
lSportsMessages = new ArrayList<>();
}
}catch(Exception e){
e.printStackTrace();
}
}
在本部分中,我使用JpaRepository中的saveAll函数批插入消息
最后,下面是我的application.yml设置
spring:
datasource:
url: jdbc:mysql://localhost:3306/dbname?serverTimezone=UTC&characterEncoding=UTF-8&autoReconnect=true&reWriteBatchedInserts=true
username: user
password: pswd
hikari:
maximum-pool-size: 1000
#max-lifetime: 1000
jpa:
properties:
hibernate:
jdbc:
batch-size: 100
lob:
non_contextual_creation: true
hibernate:
ddl-auto: update
generate-ddl: true
您需要添加以下配置项:
spring.jpa.properties.hibernate.jdbc.batch\u size=100
(请注意,这是批大小,而不是批大小)
spring.jpa.properties.hibernate.order\u inserts=true
获得一致成功后,您将需要调整MySQL、附加信息请求。在pastebin.com上发布并共享链接。从SSH登录根目录中,文本结果为:B)显示全局状态;至少24小时正常运行后C)显示全局变量;D) 显示完整的进程列表;F) 显示引擎INNODB状态;以及可选的有用信息,如果可用,包括-htop或top(最活跃的应用程序),iostat-xm 5 3(按设备和核心/cpu计数计算的IOPS),用于服务器工作负载优化分析以提供建议。
spring:
datasource:
url: jdbc:mysql://localhost:3306/dbname?serverTimezone=UTC&characterEncoding=UTF-8&autoReconnect=true&reWriteBatchedInserts=true
username: user
password: pswd
hikari:
maximum-pool-size: 1000
#max-lifetime: 1000
jpa:
properties:
hibernate:
jdbc:
batch-size: 100
lob:
non_contextual_creation: true
hibernate:
ddl-auto: update
generate-ddl: true