使用Java将数据插入MySQL 5.7表时速度非常慢(发生锁)

使用Java将数据插入MySQL 5.7表时速度非常慢(发生锁),java,mysql,hikaricp,mysql-5.7,Java,Mysql,Hikaricp,Mysql 5.7,我最近将我的数据库从MySQL 5.5迁移并升级到MySQL 5.7。在以前的旧服务器上,一切都运行得很好。但是现在我发现我的Java应用程序有一个小故障,我使用它(在旧系统上)将数据插入表中。奇怪的是,如果我在控制台上执行查询,它就可以正常工作 INSERT INTO TMPALL SELECT U.PERNR, U.SEQUENCE, U.STARTDATE, U.ENDDATE, PERSONNELAREA, PERSONNELSUBAREA, EMPLOYEEGROUP, EMPLOY

我最近将我的数据库从MySQL 5.5迁移并升级到MySQL 5.7。在以前的旧服务器上,一切都运行得很好。但是现在我发现我的Java应用程序有一个小故障,我使用它(在旧系统上)将数据插入表中。奇怪的是,如果我在控制台上执行查询,它就可以正常工作

INSERT INTO TMPALL 
SELECT U.PERNR, U.SEQUENCE, U.STARTDATE, U.ENDDATE, PERSONNELAREA, PERSONNELSUBAREA, EMPLOYEEGROUP, EMPLOYEESUBGROUP, NOMINALPOKOK, FULLNOMINALPOKOK, NOMINALPREMIUM, FULLNOMINALPREMIUM, IFNULL(AMOUNT, 0), IFNULL(FULLAMOUNT, 0), NOMINALPOKOK + NOMINALPREMIUM + IFNULL(AMOUNT, 0), FULLNOMINALPOKOK + FULLNOMINALPREMIUM + IFNULL(FULLAMOUNT, 0) 
FROM TMPJOINUP U 
LEFT JOIN TMPJOINJG J 
ON U.PERNR = J.PERNR 
AND U.STARTDATE BETWEEN J.STARTDATE AND J.ENDDATE 
AND U.ENDDATE BETWEEN J.STARTDATE AND J.ENDDATE
如果使用Java应用程序执行此查询(我使用mysql-connector-Java-5.1.40和HikariCP-2.5.1构建它),则需要5000秒以上的时间才能得到193085行的结果。但如果我在MySQL客户端控制台执行它,只需要5秒。 还有从MySQL客户端、PHP应用程序和Java应用程序到服务器的所有其他查询,运行良好。 有人能就这种情况向我提供建议吗

这是表结构:

CREATE TABLE `TMPALL` (
  `PERNR` varchar(8) COLLATE latin1_general_ci DEFAULT NULL,
  `SEQUENCE` smallint(5) unsigned DEFAULT NULL,
  `STARTDATE` date DEFAULT NULL,
  `ENDDATE` date DEFAULT NULL,
  `PERSONNELAREA` varchar(4) COLLATE latin1_general_ci DEFAULT NULL,
  `PERSONNELSUBAREA` varchar(4) COLLATE latin1_general_ci DEFAULT NULL,
  `EMPLOYEEGROUP` varchar(1) COLLATE latin1_general_ci DEFAULT NULL,
  `EMPLOYEESUBGROUP` varchar(2) COLLATE latin1_general_ci DEFAULT NULL,
  `NOMINALPOKOK` decimal(13,2) DEFAULT NULL,
  `FULLNOMINALPOKOK` decimal(13,2) DEFAULT NULL,
  `NOMINALPREMIUM` decimal(13,2) DEFAULT NULL,
  `FULLNOMINALPREMIUM` decimal(13,2) DEFAULT NULL,
  `NOMINALJG` decimal(13,2) DEFAULT NULL,
  `FULLNOMINALJG` decimal(13,2) DEFAULT NULL,
  `NOMINALCOMBINED` decimal(13,2) DEFAULT NULL,
  `FULLNOMINALCOMBINED` decimal(13,2) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci 

CREATE TABLE `TMPJOINUP` (
  `PERNR` varchar(8) COLLATE latin1_general_ci DEFAULT NULL,
  `SEQUENCE` smallint(5) unsigned DEFAULT NULL,
  `STARTDATE` date DEFAULT NULL,
  `ENDDATE` date DEFAULT NULL,
  `PERSONNELAREA` varchar(4) COLLATE latin1_general_ci DEFAULT NULL,
  `PERSONNELSUBAREA` varchar(4) COLLATE latin1_general_ci DEFAULT NULL,
  `EMPLOYEEGROUP` varchar(1) COLLATE latin1_general_ci DEFAULT NULL,
  `EMPLOYEESUBGROUP` varchar(2) COLLATE latin1_general_ci DEFAULT NULL,
  `POKOK` varchar(4) COLLATE latin1_general_ci DEFAULT NULL,
  `NOMINALPOKOK` decimal(13,2) DEFAULT NULL,
  `FULLNOMINALPOKOK` decimal(13,2) DEFAULT NULL,
  `PREMIUM` varchar(4) COLLATE latin1_general_ci DEFAULT NULL,
  `NOMINALPREMIUM` decimal(13,2) DEFAULT NULL,
  `FULLNOMINALPREMIUM` decimal(13,2) DEFAULT NULL,
  `NOMINALCOMBINED` decimal(13,2) DEFAULT NULL,
  `FULLNOMINALCOMBINED` decimal(13,2) DEFAULT NULL,
  KEY `IDX1` (`PERNR`,`STARTDATE`,`ENDDATE`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci

CREATE TABLE `TMPJG` (
  `PERNR` varchar(8) COLLATE latin1_general_ci DEFAULT NULL,
  `SEQUENCE` smallint(5) unsigned DEFAULT NULL,
  `STARTDATE` date DEFAULT NULL,
  `ENDDATE` date DEFAULT NULL,
  `WAGETYPE` varchar(4) COLLATE latin1_general_ci DEFAULT NULL,
  `AMOUNT` decimal(13,2) DEFAULT NULL,
  `FULLAMOUNT` decimal(13,2) DEFAULT NULL,
  KEY `IDX1` (`PERNR`,`STARTDATE`,`ENDDATE`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci
最后,我在执行
显示引擎innodb状态时得到了这个结果

---TRANSACTION 853444993, ACTIVE 3279 sec
mysql tables in use 3, locked 3
1302 lock struct(s), heap size 155856, 272621 row lock(s), undo log entries 74324
MySQL thread id 428981, OS thread handle 139794084808448, query id 5078166 localhost 127.0.0.1 root Sending data
INSERT INTO TMPALL SELECT U.PERNR, U.SEQUENCE, U.STARTDATE, U.ENDDATE, PERSONNELAREA, PERSONNELSUBAREA, EMPLOYEEGROUP, EMPLOYEESUBGROUP, NOMINALPOKOK, FULLNOMINALPOKOK, NOMINALPREMIUM, FULLNOMINALPREMIUM, IFNULL(AMOUNT, 0), IFNULL(FULLAMOUNT, 0), NOMINALPOKOK + NOMINALPREMIUM + IFNULL(AMOUNT, 0), FULLNOMINALPOKOK + FULLNOMINALPREM

我想Java执行时会发现一些锁,但它在MySQL客户端上运行正常。

您可以尝试不使用
ENGINE=InnoDB
?插入大数据集时,尝试执行
LOCK TABLE TMPALL WRITE
,完成
UNLOCK TABLES