Select banco access diminui a peformance

Srs., boa noite.

Recebi a tarefa de checar o cpf e cnpj de 105.000 registros que estão em uma tabela access fiz o programa e tudo o problema é o seguinte: Ele inicia o programa muito rápido e depois vai diminuindo a velocidade até parar. A solução que eu encontrei foi separar a tabela em vários selects porém isto me consome muito tempo de processamento pois preciso ficar acompanhando se esta acabando para iniciar um novo processamento. Gostaria de saber o seguinte, o resultSet tem tamanho ou eu preciso ir liberando memória ou algo parecido.

Obrigado pela ajuda,
O código segue abaixo.

IvonildoJR

package BancoDados;

import java.util.*;
import java.io.*;
//import javax.servlet.*;
//import javax.servlet.http.*;
import java.sql.*;

public class BancoDados {
	public static void main(String args[]){

			Scanner tc = new Scanner(System.in);
			ResultSet           rs = null;
			Connection     conexao = null;
			Statement stateConexao = null;
			String opcao ="s", municipio[]=
			{"ACOPIARA","ALTO SANTO","ASSARÉ","AURORA","BANABUIU","BOA VIAGEM",
			 "BREJO SANTO","CANINDÉ","CARIRÉ","CAUCAIA","CEDRO","CRATO","GRANJA",
			 "IGUATU","INDEPENDÊNCIA","IRACEMA","IRAUÇUBA","ITAPIPOCA","JAGUARETAMA",
			 "JAGUARIBARA","JAGUARIBE","JAGUARUANA","JARDIM","JATI","JUCÁS",
			 "LIMOEIRO DO NORTE","MADALENA","MARANGUAPE","MAURITI","MILAGRES","MILHÃ",
			 "MISSÃO VELHA","MOMBAÇA","MONSENHOR TABOSA","MORADA NOVA","NOVO ORIENTE",
			 "ORÓS","PARAMBU","PENAFORTE","PENTECOSTE","PORTEIRAS","QUITERIANÓPOLIS",
			 "QUIXADÁ","QUIXELÔ","RUSSAS","SABOEIRO","SANTA QUITÉRIA","SANTANA DO ACARAÚ",
			 "SANTANA DO CARIRI","SENADOR POMPEU","SOBRAL","SOLONOPOLES","TABULEIRO DO NORTE",
			 "TAMBORIL","TAUÁ","VÁRZEA ALEGRE","VIÇOSA DO CEARÁ"			
			};
			
			conexao = conectaBanco(conexao);
			for(int i=0;i<municipio.length && opcao.equalsIgnoreCase("S");i++){
				System.out.println("Processa o " + (i + 1) + "o município: " + municipio[i]);
				opcao = tc.next(); 
				if(opcao.equalsIgnoreCase("S"))
				   mostraBanco(conexao,municipio[i]);
				System.out.println("Continua processamento(S/N)?:");
				opcao = tc.next();
			}
	}
		
	public static Connection conectaBanco(Connection conexao){
		try{
			Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
			conexao = DriverManager.getConnection("jdbc:odbc:cadastro","","");
			//stateConexao = Conexao.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
			return conexao;
		}
		catch (SQLException erro){
			erro.printStackTrace();
		}catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return conexao;
	}
	
	public static void mostraBanco(Connection conexao, String municipio){
		try {
			ResultSet rs = null;
			Statement stateConexao = conexao.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
			
			//Variaveis
			String msg="", msgtp="", chave, cpfcnpj,indice,campo;
			int reg = 1;
			String sql =
				"select * from frente_indexada where munic_prop = '" + municipio + "'";
			
			//Executa sql
			rs = stateConexao.executeQuery(sql);
			
			//Vai para o 1o registro
			rs.first();
			
			//1 - cpf_cnpj - Do produtor
			//2 - cpf_conj - Do conjuge
			//3 - cpf_cnpj_prop - Do proprietário
			campo = "cpf_cnpj";
			msgtp = "1-";
			//processa enquanto tiver dados
			while(!rs.isAfterLast()){
				chave = rs.getString("chave");
				indice = rs.getString("indice");
				if (rs.getString("erro") == null)
					msg = "";
				else 
					msg = rs.getString("erro");
     			//if(rs.getString("cpf_cnpj") == null){
				if(rs.getString(campo) == null){
					cpfcnpj = " ";
				}
				else{
					//cpfcnpj = rs.getString("cpf_cnpj");
					cpfcnpj = rs.getString(campo);
				}
				if (cpfcnpj == null || (cpfcnpj.length() != 11 && cpfcnpj.length() != 14) || (cpfcnpj.indexOf(" ") >= 0) ){
					msg += msgtp+ "Tam_invalido_nulo";
				}	 
				else{
					if(cpfcnpj.length() == 11){
						msg += msgtp + Cpf_Cnpj.testaDigitoCpf(cpfcnpj);
					}   
					else{
						msg += msgtp + Cpf_Cnpj.testaDigitoCnpj(cpfcnpj);
					} 
				} 
				System.out.println("Indice:" + indice + " Chave:" + chave + " Cpf/Cnpj:" + cpfcnpj + " Municipio:" + municipio + " Msg:" + msg);
				updateBanco(indice, msg, conexao);
				reg++;
				rs.next();
			}
			rs.close();
			System.out.println("-Fim de Processamento-" + reg);
		} catch (Exception erro) {
			System.out.println(erro.getMessage());
		}
	}
		
	public static void updateBanco(String indice, String msg, Connection conexao){
	  try{
		Statement stateConexao=conexao.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
		int indiceInteiro = Integer.parseInt(indice);
		String sql = "UPDATE FRENTE_INDEXADA set erro = '" + msg + "' where indice = " + indiceInteiro;
		stateConexao.executeUpdate(sql);

	  }
	  catch (Exception e){
			System.out.println(e.getMessage());
	  }  
	}
}

EDIT - (Moderador) - Por favor, use os tags CODE para formatar seu código. É simples: olhe o botãozinho “Code” que está na mesma linha de “Corpo da Mensagem”.

Gostaria de saber o seguinte, o resultSet tem tamanho ou eu preciso ir liberando memória ou algo parecido?

Liberar memoria, rsrsrs… Vc ate pode, mas o coletor de lixo faz isso para vc.
Mas faz algumas melhoria ai, q ta foda ler essa parada.
1º - Cria uma classe separada para conexão

class singleton{
static java.sql.Connection con = null;
static{
try{//....
Class.forName("seu jar");
conn = DriverManager.getConnection("sua url");
}catch(Exception e){}//usa a exception certa blz
}

public static Connection getCon(){
return con;
}
}

Agora vc tera uma conexao só, qndo for pegar uma conection vc faz assim

Seu_atributo_conection = singleton.getCon();

2º - usa o PreparedStatement

Ha sobre o ResultSet? Acho q 105 não estora não rsrsrs.
http://www.exampledepot.com/egs/java.sql/InsertPs.html

PS: qndo for postar um codigo, coloca entre as tag code.
falow

Mr. ivanildjr

Além do fato, que já comentaram anteriormente, do seu código estar um pouco desorganizado existe um ponto importante que me chamou a atenção: Notei que vc executa a instrução UPDATE na base sem executar COMMIT, verifique se o COMMIT está sendo executado de forma automática a cada linha ou outro parametro maluco qualquer.

Uma coisa que pode levar a anomalia que vc comentou é a ÀREA DE ROLLBACK, segundo dos DBAs essa àrea é onde o banco registra suas alterações até que o usuário execute COMMIT confirmando a atualização; como vc tem +100.000 linhas o processo vai ficando lento a media que essa àrea vai enchendo.

Se for isto, monte um controle que permita vc executar COMMIT a cada ±100 linhas alteradas.

flws

Srs., boa tarde.

O programa agora esta uma bala, obrigado a todos e em especial ao Yoshikichi e Fantomas. Ao moderador minhas desculpas pela forma em que o código foi colocado no forum, não acontecerá novamente.

Saudações,

IvonildoJR