Как повысить скорость чтения файла Csv, проверить данные строки в БД и вставить действительную строку в БД?JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Как повысить скорость чтения файла Csv, проверить данные строки в БД и вставить действительную строку в БД?

Сообщение Anonymous »

У меня есть Java-приложение, которое выполняет следующие действия:
  • Чтение CSV-файла с удаленного сервера.
  • Проверка формата ( длина, формат даты, формат чисел и т. д.) и наличие в базе данных (существуют ли данные в БД).
  • Вставьте все действительные данные в БД.
    < /ol>
    До сих пор мой подход заключался в следующем:
  • Читать CSV-файл с однозначностью и зацикливать все строки. >
  • Разделите строку по разделителю на отдельную переменную, проверьте каждую переменную (например, длину, формат даты, существуют ли данные в БД и т. д.) и добавьте в подготовленный оператор с помощью .addBatch()< /li>
    Вставьте действительные данные с помощью .executeBatch()
на данный момент для этого требуется 22 минуты. обработать CSV-файл объемом 280 тыс. строк, что довольно много.
Пример CSV:

Код: Выделить всё

ID|TransID|TransDate|TransAmount|TransType

123ABC1234|TRXL123456|25102024|000000016343100|N
Пример кода:

Код: Выделить всё

public void consumeCsvFile() {
File[] listOfFiles = new File(outUrl).listFiles();
try {
for(File file : listOfFiles) {
try (Reader reader = new InputStreamReader(new FileInputStream(file), "UTF-8") ){
List parsedRows = parser.parseAll(reader);

for(String[] dataRow : parsedRows) {
boolean isValid = true;
String getData = dataRow[0];
String[] splittedData = getData.split("\\|");
List splittedDataList = new ArrayList(Arrays.asList(splittedData));
String id = "";
try { id = splittedDataList.get(0).trim(); } catch (Exception e) { }
String transId = "";
try { transId = splittedDataList.get(0).trim(); } catch (Exception e) { }
String transDate = "";
try { transDate = splittedDataList.get(0).trim(); } catch (Exception e) { }
String transAmount = "";
try { transAmount = splittedDataList.get(0).trim(); } catch (Exception e) { }
String transType = "";
try { transType = splittedDataList.get(0).trim(); } catch (Exception e) { }

if (transId.length() != 10) {
isValid = false;
}else{
boolean isTransIdExist = checkDataToDatabase(transId);
if(isTransIdExist) { isValid = false; }
}

boolean isIdExist = checkIfIdExistToDatabase(id);
if(isIdExist){ isValid = false; }

if(!validateDate(transDate)) {
isValid = false;
}

boolean isNumeric = false;
try{
Long.valueOf(transAmount);
isNumeric  = true;
if(transAmount.length() != 15){ isValid = false; }
} catch(Exception ex){ isValid = false; }

if(isValid){
// here code to insert dataRow to Database.
}else{
// Data row not valid, add to list to write into ErrorFile in the end.
}
}
}
}
} catch (Exception e) {
throw new IllegalStateException("Unable to open input file", e);
}
}

private  boolean validateDate(String dt)  {
try {
if(dt.trim().length() != 8){
return false;
}else {
SimpleDateFormat sdf = new SimpleDateFormat("ddMMyyyy");
sdf.setLenient(false);
try{
Date javaDate = sdf.parse(dt);
}catch (Exception ex){
return false;
}
}
} catch (Exception ex){
return false;
}
return true;
}
Я понятия не имею, как его оптимизировать. Я хотел бы знать, как я могу улучшить этот подход или даже использовать совершенно другой подход, если это необходимо.


Подробнее здесь: https://stackoverflow.com/questions/790 ... d-insert-v
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»