Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用MySQL处理Spring Boot中重复的多次插入?_Mysql_Spring_Spring Boot - Fatal编程技术网

如何使用MySQL处理Spring Boot中重复的多次插入?

如何使用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

我目前正在构建一个通过socket.io不断接收XML消息的应用程序

我的应用程序一收到XML消息,就会将XML解析为Java实体对象并保存它

进入MySQL数据库

我的服务器的当前规范如下所示

CPU:24核 内存:16 GB 存储:128GB(SSD)

问题是,无论我如何重构代码或实现批插入

事务之间发生延迟,导致内存泄漏

下面是我的部分代码和application.yml设置

如有任何建议,我将不胜感激

谢谢

@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