PreparedStatement trava a aplicação ao executar um comando sql;

6 respostas
J

aí galera, to com um problema que não consigo entender…
tenho uma aplicação que gera um Script SQL com uns 5000 comandos de INSERTs e/ou UPDATEs. Depois pego esse arquivo e vou lendo linha a linha e executando o comando com o seguinte método:

private boolean executaScript(String pathScript) throws Exception{
	try{
		connOracle.setAutoCommit(true);
		
		BufferedReader br = new BufferedReader(new FileReader(new File(pathScript)));
		String sql = null;
		int ct = 0;
		while((sql = br.readLine()) != null){
			ct++;
			PreparedStatement st = null;
			try{
				if(sql != null && !sql.equals("")){
					st = connOracle.prepareStatement(sql);
					st.executeUpdate();
				}
			}
			catch(Exception e){
				log("Erro: " + e.getMessage() + "\r\n");
				e.printStackTrace(printStackTrace); e.printStackTrace();
			}
			finally{
				try{ if(st != null) st.close(); }catch(SQLException e){}
			}
		} // fim WHILE sql
		log("Terminou de executar os SQLs\r\n");
	}
	catch(IOException e){
		e.printStackTrace(printStackTrace); e.printStackTrace();
		return false;
	}
	catch(SQLException e){
		e.printStackTrace(printStackTrace); e.printStackTrace();
		return false;
	}

	return true;
} // fim executaScript;

mas não sei por qual motivo e isso acontece aleatóriamente (não necessáriamente no mesmo comando sql), na hora de executar o comando a aplicação TRAVA… não faz mais nada, simplesmente trava e fica parada, até no debug qndo passo pela linha "st.executeUpdate();" ele ñ faz mais nada…

chegou a aparecer esse erro uma vez:

C:\Arquivos de programas\Audicon\ServicosAudicon\ServicoAtualizacao>java -jar ServicoAtualizacao.jar
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
        at javax.swing.BufferStrategyPaintManager.flushAccumulatedRegion(Unknown Source)
        at javax.swing.BufferStrategyPaintManager.endPaint(Unknown Source)
        at javax.swing.RepaintManager.endPaint(Unknown Source)
        at javax.swing.JComponent._paintImmediately(Unknown Source)
        at javax.swing.JComponent.paintImmediately(Unknown Source)
        at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
        at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
        at javax.swing.RepaintManager.seqPaintDirtyRegions(Unknown Source)
        at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(Unknown Source)
        at java.awt.event.InvocationEvent.dispatch(Unknown Source)
        at java.awt.EventQueue.dispatchEvent(Unknown Source)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
        at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
        at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
        at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
        at java.awt.EventDispatchThread.run(Unknown Source)

PS: a Classe que faz td isso extende JFrame e gera além do ScriptSQL, um arquivo de log.

6 Respostas

jvlouvem

Duvida. O que é executado é um script só com SQL, ou se trata de uma chamada a stored procedure ?

J

só com SQL, comandos INSERTs e UPDATEs…

exemplo do conteudo do arquivo “SQLFornecedores.sql”:

UPDATE tb_receita_retorno_pesq SET nr_cnpj_cgc = '04403408000165', nr_inscr_estadual_sintegra = '', nm_razao_social_sintegra = '', nr_telefone_sintegra = '', ds_ativ_economica_sintegra = '', ds_regime_apurac_icms_sintegra = '', ds_situacao_cadastral_sintegra = '', dt_sintegra = TO_DATE('20090114', 'yyyyMMdd'), dt_consulta_sintegra = TO_DATE('20090204', 'yyyyMMdd'), ds_mensagem_sintegra = 'Contribuinte possui múltiplas inscrições estaduais', ds_mensagem_situacao_sintegra = 'I', hr_consulta_sintegra = '092322', nr_consulta_sintegra = '', ds_inscr_estaduais_sintegra = '070001804  S  HABILITADO,041604776  S  HABILITADO,041604784  N  NÃO HABILITADO,041034635  N  NÃO HABILITADO,041056434  N  NÃO HABILITADO,047400552  N  NÃO HABILITADO,047200464  N  NÃO HA', ds_endereco_sintegra = '', nr_endereco_sintegra = '', ds_complemento_sintegra = '', nr_cep_sintegra = '', ds_bairro_sintegra = '', ds_cidade_sintegra = '', sg_estado_sintegra = '', dt_abertura_federal = TO_DATE('', 'yyyyMMdd'), nm_empresarial_federal = '', nm_fantasia_federal = '', ds_ativ_economica_federal = '', ds_natureza_juridica_federal = '', ds_situacao_cadastral_federal = '', dt_situacao_cadastral_federal = TO_DATE('', 'yyyyMMdd'), ds_situacao_especial_federal = '', dt_situacao_especial_federal = TO_DATE('', 'yyyyMMdd'), dt_pesquisa_federal = TO_DATE('', 'yyyyMMdd'), hr_pesquisa_federal = '', ds_situacao_simples_federal = '', dt_opcao_federal = TO_DATE('', 'yyyyMMdd'), ds_porte_federal = '', ds_ativ_econom_secund_federal = '', ds_endereco_federal = '', nr_endereco_federal = '', ds_complemento_federal = '', nr_cep_federal = '', ds_bairro_federal = '', ds_cidade_federal = '', sg_estado_federal = '' WHERE nr_cnpj_cgc = '04403408000165';
INSERT INTO tb_receita_retorno_pesq(nr_cnpj_cgc) VALUES('49383250000147');
UPDATE tb_receita_retorno_pesq SET nr_cnpj_cgc = '49383250000147', nr_inscr_estadual_sintegra = '', nm_razao_social_sintegra = '', nr_telefone_sintegra = '', ds_ativ_economica_sintegra = '', ds_regime_apurac_icms_sintegra = '', ds_situacao_cadastral_sintegra = '', dt_sintegra = TO_DATE('20051021', 'yyyyMMdd'), dt_consulta_sintegra = TO_DATE('20090204', 'yyyyMMdd'), ds_mensagem_sintegra = 'Contribuinte possui múltiplas inscrições estaduais', ds_mensagem_situacao_sintegra = 'I', hr_consulta_sintegra = '092326', nr_consulta_sintegra = '', ds_inscr_estaduais_sintegra = '049005120  N  NÃO HABILITADO,041443799  S  HABILITADO,047400803     ,062001604  S  HABILITADO,042154871  S  HABILITADO', ds_endereco_sintegra = '', nr_endereco_sintegra = '', ds_complemento_sintegra = '', nr_cep_sintegra = '', ds_bairro_sintegra = '', ds_cidade_sintegra = '', sg_estado_sintegra = '', dt_abertura_federal = TO_DATE('', 'yyyyMMdd'), nm_empresarial_federal = '', nm_fantasia_federal = '', ds_ativ_economica_federal = '', ds_natureza_juridica_federal = '', ds_situacao_cadastral_federal = '', dt_situacao_cadastral_federal = TO_DATE('', 'yyyyMMdd'), ds_situacao_especial_federal = '', dt_situacao_especial_federal = TO_DATE('', 'yyyyMMdd'), dt_pesquisa_federal = TO_DATE('', 'yyyyMMdd'), hr_pesquisa_federal = '', ds_situacao_simples_federal = '', dt_opcao_federal = TO_DATE('', 'yyyyMMdd'), ds_porte_federal = '', ds_ativ_econom_secund_federal = '', ds_endereco_federal = '', nr_endereco_federal = '', ds_complemento_federal = '', nr_cep_federal = '', ds_bairro_federal = '', ds_cidade_federal = '', sg_estado_federal = '' WHERE nr_cnpj_cgc = '49383250000147';

o arquivo varia a quantidade de comandos, mas sempre é acima de 3000 comandos.

PS: qndo travou, pedi para o DBA verificar e ele disse que não deu lock em nenhum registro e em nenhuma tabela.

jvlouvem

Neste caso acho que PrepareStatement não vai funcionar mesmo, porque ele precisa de ter valores setados via java. Para valores vindos direto do Sql use o Statement mesmo, tenta ai, depois me fala :wink:

J

já tentei e ocorre o mesmo problema… aliás, meu problema começou qndo estava usando o Statement, dai me disseram aqui na empresa pra mudar para PreparedStatement e o problema continuou…

procurei no google sobre o erro q aconteceu

at javax.swing.BufferStrategyPaintManager.flushAccumulatedRegion(Unknown Source)

e parece q tem algo a ver com o JTextArea…
tem um JTextArea no JFrame onde eu vou escrevendo as saidas que são as mesmas que escrevo no log.txt…
no método que passei tinha o seguinte antes:

log("Executando comando: " + sql, false);
st = connOracle.prepareStatement(sql);
st.executeUpdate();
log("OK");

onde o método log escreve no arquivo e no JTextArea… mas tirei a parte onde escreve no JTextArea e nada mudou…

alguma idéia do que seja?

H

Olá, tente fazer o seguinte.

Dê um “close()” no “PreparedStatement” depois de cada “executeUpdate”.

[]'s :slight_smile:

J

mas eu já dou close() no PreparedStatement depois do executeUpdate(), faço isso no finally do try catch:

finally{  
     try{ if(st != null) st.close(); }catch(SQLException e){}  
}

alguem tem alguma ideia do que pode ser?

Criado 4 de fevereiro de 2009
Ultima resposta 4 de fev. de 2009
Respostas 6
Participantes 3