Хотите обновить базу данных MySQL значениями из таблицы Excel за минимальное время - PullRequest
0 голосов
/ 02 мая 2018

Я написал код ниже, чтобы прочитать ячейки из Excel и затем обновить их до таблицы MySQL. Существует более 2000 записей, и этот код обновляет только последнюю запись, но не все записи. Если я поставлю 'pstm.executeBatch ();' внутри цикла for, затем он обновляет все записи, кроме одной за другой, что занимает около 2 минут. Я хочу сократить это время, поэтому добавил «& rewriteBatchedStatements = true» в URL и поместил «pstm.executeBatch ();» снаружи для петли. В консоли показывается чтение всех записей, но в базе данных обновлена ​​только последняя запись.

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);
        }   
   }
}

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

Я получил решение. Причиной задержки было то, что для AutoCommit по умолчанию установлено значение true. Поэтому я установил 'myConn.setAutoCommit (false);' перед циклом, а затем запустите код. Обновление БД для 2000 записей заняло около 8 секунд, что было примерно на 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);
        }   
   }
}
0 голосов
/ 03 мая 2018

упомянул в моем комментарии ...

    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);
            }   
       }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...