Olá!
Sou estagiário em desenvolvimento e fui encarregado de criar uma rotina java que deveria integrar os dados do banco da folha de pagamentos (Oracle) com os dados do banco do ERP da empresa (Firebird). De forma resumida, desenvolvi uma rotina que, ao ser executada diariamente, faria uma consulta em ambos os bancos, compararia os ResultSet’s de cada consulta e então executaria os Updates ou Inserts de acordo com a necessidade.
Por exemplo:
Para cada linha do ResultSet Oracle, deve-se
Comparar o Nº Matrícula do ResultSet Oracle com o Nº Matrícula de cada linha do ResultSet Firebird.
Se igual, conferir dados do funcionário. Caso exista discrepâncias, efetuar Update no banco Firebird usando os dados do ResultSet Oracle (pois são os mais atualizados/confiáveis).
Se diferente, ir para a próxima linha do ResultSet Oracle.
Caso não encontre um correspondente direto (o que significa que o funcionário é novo, pois sua matrícula não está cadastrada no banco Firebird), efetuar Insert no banco Firebird usando os dados do ResultSet Oracle.
Mas eis meu problema: cada ResultSet tem em torno de 10 mil linhas. Como eu poderia acelerar o processo de busca? Estou usando um for dentro de outro for para efetuar tal processo, isso é o mais correto a ser feito?
Eis meu código:
// Percorre ambos os resultsets
for (int currentRowOracle = 1; currentRowOracle <= numberOfRowsOracle; currentRowOracle++) {
for (int currentRowFirebird = 1; currentRowFirebird <= numberOfRowsFirebird; currentRowFirebird++) {
absoluteOracle = rstOracle.absolute(currentRowOracle);
absoluteFirebird = rstFirebird.absolute(currentRowFirebird);
if (rstFirebird.getString("CD_Mat_Digito") != null) {
if (absoluteOracle && absoluteFirebird && rstOracle.getInt("MATRICULA_FUNCIONARIO") == (Integer.parseInt(rstFirebird.getString("CD_MATRICULA") + rstFirebird.getString("CD_Mat_Digito")))) {
// CHAMA MÉTODO PARA CRIAÇÃO DA QUERY UPDATE
sqlUpdate.append(UpdateUser(currentRowOracle, currentRowFirebird, rstOracle, rstFirebird));
hasBeenUpdated = true;
currentRowFirebird = numberOfRowsFirebird;
}
if ((Integer.parseInt(rstFirebird.getString("CD_MATRICULA") + rstFirebird.getString("CD_Mat_Digito"))) > rstOracle.getInt("MATRICULA_FUNCIONARIO")) {
currentRowFirebird = numberOfRowsFirebird;
}
}
}
if (hasBeenUpdated) {
hasBeenUpdated = false;
} else {
// CHAMA MÉTODO PARA CRIAÇÃO DA QUERY INSERT
sqlInsert.append(InsertUser(currentRowOracle, rstOracle));
}
}
Vale ressaltar que as matrículas estarão em ordem crescente, logo uma das coisas que fiz para acelerar um pouco o processo é terminar o for mais interno assim que o número de matrícula do ResultSet Firebird for maior que o número de matrícula do ResultSet Oracle:
if ((Integer.parseInt(rstFirebird.getString("CD_MATRICULA") + rstFirebird.getString("CD_Mat_Digito"))) > rstOracle.getInt("MATRICULA_FUNCIONARIO")) {
currentRowFirebird = numberOfRowsFirebird;
}
Fora isso, por conta da falta de experiência no ramo, não consigo imaginar outras formas de acelerar tal processo. Talvez alguém possa me ajudar com algum insight, um rumo, uma dica, ou qualquer coisa do tipo.
Desde já, agradeço!