У меня есть программа, которая получает большой набор данных от одного DB, а затем необходимо поиск подробностей в каждой записи во второй БД и сохранить анализ в текстовом файле. Программа работает, но первый набор данных часто составляет более миллиона записей, поэтому моя программа занимает 3 дня (не фигура речи!), Чтобы запустить. Я хотел знать, как реализовать потоки для повышения производительности. Это теперь решается (см. Ниже). Я также получил и внедрил множество других предложений по повышению производительности.
Спасибо всем за вклад. /**
* For each row, get the record from aus_national and retrieve the CRs.
*/
Connection sqlConn = thisRun.getSQLCon();
if(sqlConn != null) {
try {
for (CaseData currentCase : cases) {
ProcessCase storeCase = new ProcessCase(currentCase, sqlConn, (org.apache.logging.log4j.core.Logger) LOGGER, config);
storeCase.run();
}
} catch (Exception e) {
LOGGER.error("The thread pool failed : {}",e);
}
}
выполняемый объект
package gov.usdohud.chums;
import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.apache.logging.log4j.core.Logger;
import gov.usdohud.dao.CaseData;
import gov.usdohud.helper.AUSInflator;
import gov.usdohud.model.ConfigData;
@SuppressWarnings("unused")
public class ProcessCase {
private CaseData currentCase;
private Connection conn;
private Logger LOGGER;
private ConfigData config;
public ProcessCase(CaseData currentCase, Connection conn,Logger logger, ConfigData config) {
this.currentCase = currentCase;
this.conn = conn;
this.LOGGER = logger;
this.config = config;
}
/**
* Use case data from sfdw to get the CR(s) from aus_national.
* @param currentCase
*/
public void run() {
String loanNumber = currentCase.getLoan_nbr();
String caseNumber = currentCase.getCase_nbr();
String scoreDate = currentCase.getScore_dt();
String aus = currentCase.getUndrwrtr_id();
String sqlString = "select file_data from aus_credit where loan_number = ? and score_dt = ? and aus = ?";
// pull CR(s)
try {
PreparedStatement stmt = conn.prepareStatement(sqlString);
stmt.setString(1, loanNumber);
stmt.setString(2, scoreDate.replaceAll("\\..*$", "").replace("-", "/"));
stmt.setString(3, aus);
ResultSet rs = stmt.executeQuery();
while (rs.next()) {
int sequence = rs.getRow();
writeCR(rs.getBinaryStream("file_data"),sequence);
}
} catch (SQLException e) {
LOGGER.error("Case {} was not retrieved. Loan number is {}, score date is {}, and aus is {}",caseNumber,loanNumber,scoreDate.replaceAll("\\..*$", "").replace("-", "/"),aus);
}
}
/**
* Write each CR to text file as caseNumber-[sequence number]
* @param lOGGER2
* @param config2
* @param sequence
* @param inputStream
* @param caseNumber
* @param string
*/
private void writeCR(InputStream cr, int seq) {
final String fn = config.getDataFolder() + "/" + this.currentCase.getCase_nbr() + "-" + String.valueOf(seq) + ".txt";
AUSInflator decode = new AUSInflator();
byte[] crBytes = null;
try {
crBytes = cr.readAllBytes();
} catch (IOException e) {
LOGGER.error("Unable to get CR data for case {}, sequence {} : {}", this.currentCase.getCase_nbr(), seq,e);
}
String thisCR = decode.unZipIt(crBytes).replaceAll("", "").replaceAll("", "");
try(FileOutputStream fos = new FileOutputStream(fn)) {
fos.write(thisCR.getBytes());
} catch (IOException e) {
LOGGER.error("Unable to create CR file for case {}, sequence {} : {}", this.currentCase.getCase_nbr(), seq,e);
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/797 ... ementation
Java Threads. Правильная реализация [закрыто] ⇐ JAVA
Программисты JAVA общаются здесь
-
Anonymous
1759142080
Anonymous
У меня есть программа, которая получает большой набор данных от одного DB, а затем необходимо поиск подробностей в каждой записи во второй БД и сохранить анализ в текстовом файле. Программа работает, но первый набор данных часто составляет более миллиона записей, поэтому моя программа занимает 3 дня (не фигура речи!), Чтобы запустить. Я хотел знать, как реализовать потоки для повышения производительности. Это теперь решается (см. Ниже). Я также получил и внедрил множество других предложений по повышению производительности.
Спасибо всем за вклад. /**
* For each row, get the record from aus_national and retrieve the CRs.
*/
Connection sqlConn = thisRun.getSQLCon();
if(sqlConn != null) {
try {
for (CaseData currentCase : cases) {
ProcessCase storeCase = new ProcessCase(currentCase, sqlConn, (org.apache.logging.log4j.core.Logger) LOGGER, config);
storeCase.run();
}
} catch (Exception e) {
LOGGER.error("The thread pool failed : {}",e);
}
}
[b] выполняемый объект [/b]
package gov.usdohud.chums;
import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.apache.logging.log4j.core.Logger;
import gov.usdohud.dao.CaseData;
import gov.usdohud.helper.AUSInflator;
import gov.usdohud.model.ConfigData;
@SuppressWarnings("unused")
public class ProcessCase {
private CaseData currentCase;
private Connection conn;
private Logger LOGGER;
private ConfigData config;
public ProcessCase(CaseData currentCase, Connection conn,Logger logger, ConfigData config) {
this.currentCase = currentCase;
this.conn = conn;
this.LOGGER = logger;
this.config = config;
}
/**
* Use case data from sfdw to get the CR(s) from aus_national.
* @param currentCase
*/
public void run() {
String loanNumber = currentCase.getLoan_nbr();
String caseNumber = currentCase.getCase_nbr();
String scoreDate = currentCase.getScore_dt();
String aus = currentCase.getUndrwrtr_id();
String sqlString = "select file_data from aus_credit where loan_number = ? and score_dt = ? and aus = ?";
// pull CR(s)
try {
PreparedStatement stmt = conn.prepareStatement(sqlString);
stmt.setString(1, loanNumber);
stmt.setString(2, scoreDate.replaceAll("\\..*$", "").replace("-", "/"));
stmt.setString(3, aus);
ResultSet rs = stmt.executeQuery();
while (rs.next()) {
int sequence = rs.getRow();
writeCR(rs.getBinaryStream("file_data"),sequence);
}
} catch (SQLException e) {
LOGGER.error("Case {} was not retrieved. Loan number is {}, score date is {}, and aus is {}",caseNumber,loanNumber,scoreDate.replaceAll("\\..*$", "").replace("-", "/"),aus);
}
}
/**
* Write each CR to text file as caseNumber-[sequence number]
* @param lOGGER2
* @param config2
* @param sequence
* @param inputStream
* @param caseNumber
* @param string
*/
private void writeCR(InputStream cr, int seq) {
final String fn = config.getDataFolder() + "/" + this.currentCase.getCase_nbr() + "-" + String.valueOf(seq) + ".txt";
AUSInflator decode = new AUSInflator();
byte[] crBytes = null;
try {
crBytes = cr.readAllBytes();
} catch (IOException e) {
LOGGER.error("Unable to get CR data for case {}, sequence {} : {}", this.currentCase.getCase_nbr(), seq,e);
}
String thisCR = decode.unZipIt(crBytes).replaceAll("", "").replaceAll("", "");
try(FileOutputStream fos = new FileOutputStream(fn)) {
fos.write(thisCR.getBytes());
} catch (IOException e) {
LOGGER.error("Unable to create CR file for case {}, sequence {} : {}", this.currentCase.getCase_nbr(), seq,e);
}
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79777343/java-threads-proper-implementation[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия