Algum forma de continuar com uma rotina mesmo se a conexão cair (jdbc)

8 respostas
jason_bourne

Pessoal,

Usando só o jdbc eu tenho como implementar alguma forma de minimizar o risco de queda da conexão com o banco? Por exemplo…se eu tiver uma rotina de carga de dados, e derrepente a conexão com o banco for resetada, ele voltaria de onde ele parou e continuaria normalmente.

8 Respostas

M

O canal era tu fazer um gerenciamento de transação para dar Rollback após fazer o que tu quer fazer. Depois iniciar tudo do inicio quando a conexão com o banco voltar. Mas se quer fazer isso se continuar… tu pode botar tudo dentro de um e capturar a exceção. No while tem algum tipo de flag. dai se der exceção que o banco caiu tu simplesmente da um sleep(5000); e tenta denovo fazer o que tu fez. Se tiver algo mais concreto de o que tu vai fazer posso te dar uma dica melhor…

jason_bourne

Então kra…eu ja tenho uma rotina pronta pra fazer carga de um database para outro. São muitos dados e chega um determinado ponto a conexão é resetada ai ferra tudo. Eu acho que é alguma coisa com a conexão nat. Na verdade isso não importa. Tenho que fazer um esquema pra resolver isso. Tentei usar o datasource do jboss, mas não estou conseguindo configurar ele direito, então acho que a melhor solução mesmo é o jdbc puro. Como eu faria esse sleep(5000)? eu coloco onde ele?

M

Tu não tem como fazer um PL/SQL pra rodar essa rotina? Vai ser bem mais rápido e vai fazer tudo em uma só chamada.

Senão, caso tu receba os dados a ser enviados através de uma List tu pode fazer algo tipo isso:

while(list.size > 0){
    try{
       enviaProBanco(list.get(0));
       list.remove(0);
    } catch(Exception e){
       Thread.sleep(3000);
    }

O sleep é só pra dar um tempo mesmo e não sobrecarregar o server. Dai se der erro ele vai tentar a cada 3 segundos retomar de onde ele parou.

jason_bourne

mauriciorocha665:
Tu não tem como fazer um PL/SQL pra rodar essa rotina? Vai ser bem mais rápido e vai fazer tudo em uma só chamada.

Senão, caso tu receba os dados a ser enviados através de uma List tu pode fazer algo tipo isso:

while(list.size > 0){
    try{
       enviaProBanco(list.get(0));
       list.remove(0);
    } catch(Exception e){
       Thread.sleep(3000);
    }

O sleep é só pra dar um tempo mesmo e não sobrecarregar o server. Dai se der erro ele vai tentar a cada 3 segundos retomar de onde ele parou.

Kra…só isso ??? Thread.sleep(3000);

Se for só isso é mt fácil.

Sobre o PL, não tem como …o cliente quer em java, não quer usar dblink com o PL/SQL

jason_bourne

Kra,

Meu código ta atualmente +/- assim:

try {

			registraLog.registra(new Timestamp(System.currentTimeMillis()),"log", utilitarios.getNomeDoMetodo()+" iniciando...");

			SelectsDAO persistedados = new SelectsDAO();
			Collection retorno = persistedados.SelectCarregandoDados();

			CarregandoDadosBean entrada = null;
			ArrayList items = (ArrayList) retorno;
			PrCargaIncDAO prcarga = new PrCargaIncDAO();

			for (int i = 0; i < retorno.size(); i++) {

				entrada = (CarregandoDadosBean) items.get(i);

				prcarga.UpInsCarregandoDados(entrada,i,retorno.size());


			}

			registraLog.registra(new Timestamp(System.currentTimeMillis()),"log", utilitarios.getNomeDoMetodo()+" finalizado...");

			retorno = null;

		} catch (SQLException e) {
			registraLog.registra(new Timestamp(System.currentTimeMillis()),"erroExcep", utilitarios.getNomeDoMetodo()+":\n"+e.toString());
			e.printStackTrace();
		}
	}

Eu só colocaria aquele Thread.sleep(3000); dentro do SQLException?

jason_bourne

Kra…eu fiz isso ai…só q ele não volta na parte onde ele parou…ele simplesmente continua pra próxima classe. Talvez pq todas as classes da rotina estejam na mesma Thread.

M

Tu tem que fazer uma condição que faça ir para o proximo registro se der certo ou execute o mesmo se der errado. É só logica de programação. n tem misterio.

[]'s

jason_bourne

mauriciorocha665:
Tu tem que fazer uma condição que faça ir para o proximo registro se der certo ou execute o mesmo se der errado. É só logica de programação. n tem misterio.

[]'s

Mas como eu vou verificar se deu certo ou não?

Criado 14 de dezembro de 2007
Ultima resposta 17 de dez. de 2007
Respostas 8
Participantes 2