Problema com executeBatch no DB2

3 respostas
crpablo

Falae pessoal...

To com um problema estranho aqui, já procurei por tudo e não encontrei solução.

O problema é o seguinte.

Tenho um processo java que, dependendo do tipo de dado que ele receber, executa uma procedure específica da seguinte forma:

Se o dado for uma variavel de SERVIÇO
//Tipo de dado que a procedure recebe
CALL V1_INS_SERVDATA ( INTEGER, INTEGER, VARCHAR(251), TIMESTAMP, INTEGER, VARCHAR(251) )

//Exemplo de chamada a procedure
CALL V1_INS_SERVDATA ( 36566, 64963, 'Servico_PING', '2012-04-30 14:11:12',0, 'PING OK - Packet loss = 0%, RTA = 0.15 ms' )
Se o dado for uma variável de DESEMPENHO
//Tipo de dado que a procedure recebe
CALL V7_INS_COLDATA ( INTEGER, INTEGER, VARCHAR(251), VARCHAR (251), TIMESTAMP, INTEGER, INTEGER, VARCHAR (128), DOUBLE, VARCHAR (15), VARCHAR (251), VARCHAR (15), VARCHAR (250), VARCHAR (15), INTEGER )

//Exemplo de chamada a procedure
CALL V7_INS_COLDATA ( 10779, 1940, 'Utilizacao_Cpu', 'EXPRESSION','2012-04-30 14:11:42', [telefone removido], [telefone removido], '0', 4.0, null, '192.168.163.30', '192.168.163.30', '192.168.163.28', '192.168.163.179', 5 )
Dependendo da quantidade de arquivos que o processo recebe, ele passa inúmeras vezes pela chamada das procedures e adiciona no batch:
preStatement.addBatch();
Ao final da leitura dos arquivos ele executa o batch:
preStatement.executeBatch();
E é exatamente nesse momento que aparece o problema:
com.ibm.db2.jcc.a.ge: Non-atomic batch failure.  The batch was submitted, but at least one exception occurred on an individual member of the batch. Use getNextException() to retrieve the exceptions for specific batched elements.
	at com.ibm.db2.jcc.a.j.a(j.java:397)
	at com.ibm.db2.jcc.a.id.b(id.java:2935)
	at com.ibm.db2.jcc.a.id.a(id.java:2704)
	at com.ibm.db2.jcc.a.id.executeBatch(id.java:2516)
	at com.ibm.db2.jcc.a.id.executeBatch(id.java:1348)
	at br.com.empresa.export.InsereBanco.insereBancoBatch(InsereBanco.java:313)
	at br.com.empresa.export.InsereBanco.verificaDados(InsereBanco.java:71)
	at br.com.empresa.export.InsereBanco.run(InsereBanco.java:551)
	at java.lang.Thread.run(Thread.java:595)
2012-04-30 15:57:05,184 RROR [ead-6] InsereBanco () - getNextException: 
com.ibm.db2.jcc.a.SqlException: Error for batch element #0: DB2 SQL error: SQLCODE: -301, SQLSTATE: 07006, SQLERRMC: 9
	at com.ibm.db2.jcc.a.hd.d(hd.java:1392)
	at com.ibm.db2.jcc.c.jb.l(jb.java:366)
	at com.ibm.db2.jcc.c.jb.e(jb.java:102)
	at com.ibm.db2.jcc.c.w.e(w.java:72)
	at com.ibm.db2.jcc.c.cc.i(cc.java:202)
	at com.ibm.db2.jcc.a.hd.q(hd.java:1359)
	at com.ibm.db2.jcc.a.id.b(id.java:2891)
	at com.ibm.db2.jcc.a.id.a(id.java:2704)
	at com.ibm.db2.jcc.a.id.executeBatch(id.java:2516)
	at com.ibm.db2.jcc.a.id.executeBatch(id.java:1348)
	at br.com.empresa.export.InsereBanco.insereBancoBatch(InsereBanco.java:313)
	at br.com.empresa.export.InsereBanco.verificaDados(InsereBanco.java:71)
	at br.com.empresa.export.InsereBanco.run(InsereBanco.java:551)
	at java.lang.Thread.run(Thread.java:595)

Já executei todas as chamadas que o processo faz á procedure direto no banco e todas funcionam.
Quando eu comento a chamada da procedure V7_INS_COLDATA o batch funciona normalmente com as chamadas à procedure V1_INS_SERVDATA, porém o contrário não ocorre, se comentar a procedure de serviço e deixar somente a de desempenho, a mesma não funciona no batch.
Se eu executar as chamadas à procedure sem adicionar no batch, chamar com o execute, funciona perfeitamente também.

Resumindo, se eu adicionar a procedure V7 no batch da problema, se não adicionar tudo funciona.

Alguém tem alguma idéia do que pode ser isso?

Valeu e abraços

3 Respostas

romarcio

Você pode procurar pelo código dos erros para ver o que aconteceu, por exemplo: com.ibm.db2.jcc.a.SqlException: Error for batch element #0: DB2 SQL error: SQLCODE: -301, SQLSTATE: 07006, SQLERRMC: 9
SQL error: SQLCODE: -301: http://publib.boulder.ibm.com/infocenter/dzichelp/v2r2/index.jsp?topic=%2Fcom.ibm.db2z10.doc.codes%2Fsrc%2Ftpc%2Fdb2z_sqlcodes.htm

crpablo

romarcio:
Você pode procurar pelo código dos erros para ver o que aconteceu, por exemplo: com.ibm.db2.jcc.a.SqlException: Error for batch element #0: DB2 SQL error: SQLCODE: -301, SQLSTATE: 07006, SQLERRMC: 9
SQL error: SQLCODE: -301: http://publib.boulder.ibm.com/infocenter/dzichelp/v2r2/index.jsp?topic=%2Fcom.ibm.db2z10.doc.codes%2Fsrc%2Ftpc%2Fdb2z_sqlcodes.htm

Fala romarcio…

Já tinha feito isso cara, porém, o código -301 fala de incompatibilidade de dados. Mas se a chamada à procedure funciona se passo uma à uma ou se executo todas direto no banco, essa incompatibilidade não existe.

Abraço

crpablo

Os dados que alimentam o processo estavam chegando invertidos em raros casos na V7…

Corrigido e resolvido o problema…

Valeuuuuu

abraçooo

Criado 30 de abril de 2012
Ultima resposta 2 de mai. de 2012
Respostas 3
Participantes 2