想在最短的时间内用excel工作表中的值更新MySQL数据库吗
我写了下面的代码从excel中读取单元格,然后将其更新到MySQL表。有2000多条记录,此代码仅更新最后一条记录,而不是所有记录。如果我把'pstm.executeBatch();'在for循环内部,然后它更新所有记录,但逐个更新,这需要大约2分钟。我想减少这一时间,所以在URL中添加了“&rewriteBatchedStatements=true”,并将“pstm.executeBatch();”放在外循环。在控制台中,它显示所有记录的读取,但数据库只更新了最后一条记录想在最短的时间内用excel工作表中的值更新MySQL数据库吗,mysql,excel,jdbc,Mysql,Excel,Jdbc,我写了下面的代码从excel中读取单元格,然后将其更新到MySQL表。有2000多条记录,此代码仅更新最后一条记录,而不是所有记录。如果我把'pstm.executeBatch();'在for循环内部,然后它更新所有记录,但逐个更新,这需要大约2分钟。我想减少这一时间,所以在URL中添加了“&rewriteBatchedStatements=true”,并将“pstm.executeBatch();”放在外循环。在控制台中,它显示所有记录的读取,但数据库只更新了最后一条记录 package co
package com.company.testdata;
import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import javax.servlet.ServletException;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class UpdateDataCopy {
public static void main(String[] args) throws Exception {
String user = "root";
String pass = "test";
String jdbcUrl = "jdbc:mysql://192.1.2.1/db_bro_mumbai?useSSL=false"+
"&rewriteBatchedStatements=true";
String driver = "com.mysql.jdbc.Driver";
try {
PreparedStatement pstm = null;
Class.forName(driver);
Connection myConn = DriverManager.getConnection(jdbcUrl, user, pass);
FileInputStream input = new FileInputStream("E:\\Work\\TestData.xlsx");
XSSFWorkbook workbook = new XSSFWorkbook(input);
XSSFSheet sheet = workbook.getSheetAt(0);
XSSFRow row;
for (int i = 1; i <= sheet.getLastRowNum(); i++) {
row = (XSSFRow) sheet.getRow(i);
int id = (int)row.getCell(0).getNumericCellValue();
System.out.println(id);
String firstname = row.getCell(2).getStringCellValue();
System.out.println(firstname);
String middlename = row.getCell(3).getStringCellValue();
System.out.println(middlename);
String lastname = row.getCell(4).getStringCellValue();
System.out.println(lastname);
int physicalFitness = (int)row.getCell(25).getNumericCellValue();
System.out.println(physicalFitness);
String sql = "UPDATE fitness_details as p SET p.physicalFitness = ? "
+ " WHERE CandidateID_FK1 = ?";
pstm = (PreparedStatement) myConn.prepareStatement(sql);
pstm.setInt(1, physicalFitness);
pstm.setInt(2, id);
pstm.addBatch();
//Adding below line will update record one by one which is time consuming, so I commented this and added it after for loop.
//pstm.executeBatch();
System.out.println("Import rows " + i);
}
pstm.executeBatch();
System.out.println("Imported");
//myConn.commit();
//pstm.close();
//myConn.close();
input.close();
}
catch (Exception exc) {
exc.printStackTrace();
throw new ServletException(exc);
}
}
}
package com.company.testdata;
导入java.io.FileInputStream;
导入java.sql.Connection;
导入java.sql.DriverManager;
导入java.sql.PreparedStatement;
导入javax.servlet.ServletException;
导入org.apache.poi.xssf.usermodel.XSSFRow;
导入org.apache.poi.xssf.usermodel.xssfheet;
导入org.apache.poi.xssf.usermodel.xssf工作簿;
公共类更新副本{
公共静态void main(字符串[]args)引发异常{
字符串user=“root”;
字符串pass=“test”;
String jdbcUrl=“jdbc:mysql://192.1.2.1/db_bro_mumbai?useSSL=false"+
“&rewriteBatchedStatements=true”;
String driver=“com.mysql.jdbc.driver”;
试一试{
PreparedStatement pstm=null;
Class.forName(驱动程序);
Connection myConn=DriverManager.getConnection(jdbcUrl、user、pass);
FileInputStream输入=新的FileInputStream(“E:\\Work\\TestData.xlsx”);
XSSF工作簿=新XSSF工作簿(输入);
XSSFSheet sheet=workbook.getSheetAt(0);
XSSFRow行;
对于(inti=1;i在我的评论中提到的
package com.company.testdata;
import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import javax.servlet.ServletException;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class UpdateDataCopy {
public static void main(String[] args) throws Exception {
String user = "root";
String pass = "test";
String jdbcUrl = "jdbc:mysql://172.16.206.197/db_bro_mumbai?useSSL=false"+
"&rewriteBatchedStatements=true";
String driver = "com.mysql.jdbc.Driver";
try {
PreparedStatement pstm = null;
Class.forName(driver);
Connection myConn = DriverManager.getConnection(jdbcUrl, user, pass);
String sql = "UPDATE fitness_details as p SET p.physicalFitness = ? WHERE CandidateID_FK1 = ?";
pstm = myConn.prepareStatement(sql);
FileInputStream input = new FileInputStream("E:\\Work\\TestData.xlsx");
XSSFWorkbook workbook = new XSSFWorkbook(input);
XSSFSheet sheet = workbook.getSheetAt(0);
XSSFRow row;
for (int i = 1; i <= sheet.getLastRowNum(); i++) {
row = (XSSFRow) sheet.getRow(i);
int id = (int)row.getCell(0).getNumericCellValue();
String firstname = row.getCell(2).getStringCellValue();
String middlename = row.getCell(3).getStringCellValue();
String lastname = row.getCell(4).getStringCellValue();
int physicalFitness = (int)row.getCell(25).getNumericCellValue();
pstm.setInt(1, physicalFitness);
pstm.setInt(2, id);
pstm.addBatch();
System.out.println("Import rows " + I + "ID: " + id + " Middlename:" + middlename + " Lastname:" + lastname + " Physicalfitness:" + physicalFitness );
}
pstm.executeBatch();
System.out.println("Imported");
//myConn.commit();
pstm.close();
myConn.close();
input.close();
}
catch (Exception exc) {
exc.printStackTrace();
throw new ServletException(exc);
}
}
}
package com.company.testdata;
导入java.io.FileInputStream;
导入java.sql.Connection;
导入java.sql.DriverManager;
导入java.sql.PreparedStatement;
导入javax.servlet.ServletException;
导入org.apache.poi.xssf.usermodel.XSSFRow;
导入org.apache.poi.xssf.usermodel.xssfheet;
导入org.apache.poi.xssf.usermodel.xssf工作簿;
公共类更新副本{
公共静态void main(字符串[]args)引发异常{
字符串user=“root”;
字符串pass=“test”;
String jdbcUrl=“jdbc:mysql://172.16.206.197/db_bro_mumbai?useSSL=false"+
“&rewriteBatchedStatements=true”;
String driver=“com.mysql.jdbc.driver”;
试一试{
PreparedStatement pstm=null;
Class.forName(驱动程序);
Connection myConn=DriverManager.getConnection(jdbcUrl、user、pass);
String sql=“将健身详细信息更新为p SET p.physicalFitness=?其中CandidateID_FK1=?”;
pstm=myConn.prepareStatement(sql);
FileInputStream输入=新的FileInputStream(“E:\\Work\\TestData.xlsx”);
XSSF工作簿=新XSSF工作簿(输入);
XSSFSheet sheet=workbook.getSheetAt(0);
XSSFRow行;
对于(int i=1;i我得到了解决方案。造成时间延迟的原因是默认情况下“AutoCommit”设置为“true”。因此,我在循环之前设置“myConn.setAutoCommit(false);”,然后运行代码。大约花了8秒钟更新2000条记录的数据库,这大约是2分钟之前的记录。下面是供参考的代码-
package com.company.testdata;
import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import javax.servlet.ServletException;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class UpdateDataCopy {
public static void main(String[] args) throws Exception {
String user = "root";
String pass = "test";
String jdbcUrl = "jdbc:mysql://192.1.2.1/db_bro_mumbai?useSSL=false";
String driver = "com.mysql.jdbc.Driver";
try {
PreparedStatement pstm = null;
Class.forName(driver);
Connection myConn = DriverManager.getConnection(jdbcUrl, user, pass);
FileInputStream input = new FileInputStream("E:\\Work\\TestData.xlsx");
XSSFWorkbook workbook = new XSSFWorkbook(input);
XSSFSheet sheet = workbook.getSheetAt(0);
XSSFRow row;
myConn.setAutoCommit(false);
/*final int batchSize = 1000;
int count = 0;*/
long start = System.currentTimeMillis();
for (int i = 1; i <= sheet.getLastRowNum(); i++) {
row = (XSSFRow) sheet.getRow(i);
int id = (int)row.getCell(0).getNumericCellValue();
System.out.println(id);
String firstname = row.getCell(2).getStringCellValue();
System.out.println(firstname);
String middlename = row.getCell(3).getStringCellValue();
System.out.println(middlename);
String lastname = row.getCell(4).getStringCellValue();
System.out.println(lastname);
int physicalFitness = (int)row.getCell(25).getNumericCellValue();
System.out.println(physicalFitness);
String sql = "UPDATE fitness_details as p SET p.physicalFitness = ? "
+ " WHERE CandidateID_FK1 = ?";
pstm = (PreparedStatement) myConn.prepareStatement(sql);
pstm.setInt(1, physicalFitness);
pstm.setInt(2, id);
pstm.addBatch();
pstm.executeBatch();
System.out.println("Import rows " + i);
}
System.out.println("Time Taken="+(System.currentTimeMillis()-start));
myConn.commit();
myConn.setAutoCommit(true);
pstm.close();
myConn.close();
input.close();
}
catch (Exception exc) {
exc.printStackTrace();
throw new ServletException(exc);
}
}
}
package com.company.testdata;
导入java.io.FileInputStream;
导入java.sql.Connection;
导入java.sql.DriverManager;
导入java.sql.PreparedStatement;
导入javax.servlet.ServletException;
导入org.apache.poi.xssf.usermodel.XSSFRow;
导入org.apache.poi.xssf.usermodel.xssfheet;
导入org.apache.poi.xssf.usermodel.xssf工作簿;
公共类更新副本{
公共静态void main(字符串[]args)引发异常{
字符串user=“root”;
字符串pass=“test”;
String jdbcUrl=“jdbc:mysql://192.1.2.1/db_bro_mumbai?useSSL=false";
String driver=“com.mysql.jdbc.driver”;
试一试{
PreparedStatement pstm=null;
Class.forName(驱动程序);
Connection myConn=DriverManager.getConnection(jdbcUrl、user、pass);
FileInputStream输入=新的FileInputStream(“E:\\Work\\TestData.xlsx”);
XSSF工作簿=新XSSF工作簿(输入);
XSSFSheet sheet=workbook.getSheetAt(0);
XSSFRow行;
myConn.setAutoCommit(假);
/*最终int batchSize=1000;
整数计数=0*/
长启动=System.currentTimeMillis();
对于(int i=1;i),您正在每个循环上创建PreparedStatement。当您在循环之前准备语句时,可能会赢得一些时间。System.out.println也会花费一些时间。如果您在一个System.out.println中打印整个信息,那么一定会快得多。感谢您的回复。这占用的时间与以前几乎相同。