Kbase 51774: OpenEdge JDBC Insufficient Memory error.
Autor |
  Eloi Rene Pscheidt - STF |
Acesso |
  Público |
Publicação |
  05/01/2017 |
|
OpenEdge JDBC Insufficient Memory error.
Ambiente:
Banco de dados em Linux CentOS 6.1
Aplicação Client JDBC em Windows ou Linux
Problema:
Erro ao executar o seguinte comando SQL:
select distinct TOP 10 * from (
select "pub"."auxAmb"."cd-esp-amb" cdEsp, "pub"."auxAmb"."cd-grupo-proc-amb" cdGrupo,"pub"."auxAmb"."cd-procedimento" cdProced,"pub"."auxAmb"."dv-procedimento" dvProced, "pub"."auxAmb"."ds-procedimento" des, "pub"."auxAmb"."cd-procedimento-completo" cdConcatProc, "auxAmb"."int-13" cdnTabGest
from "pub".trmodamb t
inner join "pub"."ambproce" auxAmb on "t"."cd-esp-amb" = "pub"."auxAmb"."cd-esp-amb" and "t"."cd-grupo-proc-amb" = "pub"."auxAmb"."cd-grupo-proc-amb" and "t"."cd-procedimento" = "pub"."auxAmb"."cd-procedimento" and "t"."dv-procedimento" = "pub"."auxAmb"."dv-procedimento" and "t"."dt-limite" >= SYSDATE and "t"."cd-transacao" = 250 AND des LIKE '%RX -D%' and "pub"."auxAmb"."dat-inic-vigenc" <= SYSDATE and "pub"."auxAmb"."dat-fim-vigenc" >= SYSDATE and "pub"."auxAmb"."lg-padrao" = 1
) proc
inner join "pub"."tip-tab" tt on tt."cdn-tab-gest" = proc."cdnTabGest" and tt."cod-versao" = '3.02.00'
WITH (NOLOCK);
Apresenta o erro:
2016-10-10 17:34:18,546 ERROR [STDERR] java.sql.SQLException: [DataDirect][OpenEdge JDBC Driver][OpenEdge] Insufficient Memory. Memory allocation failed at 1609 in /vobs_sql/sql/src/public/data/dt_array.cxx. Contact Progress Technical Support
Mais detalhes:
Aplicação Totvs Autorizador Saúde
Conexões JDBC realizadas pelo JBOSS, configuradas nos arquivos progress-ds.xml e erp-ds.xml, ambos na sub-pasta DEPLOY do servidor de aplicação.
O erro reportado pelo driver JDBC não apresenta qual foi o comando SQL que gerou o problema.
Por isso foi necessário aumentar o nível de log do JBOSS para DEBUG para ter certeza do último comando SQL processado.
Apenas com este nível de log foi possível identificar o comando exato que apresentou o problema.
Ativando trace de comandos do engine SQL, através do comando "SET PRO_SERVER LOG ON with (statement)", não gera nenhum erro no arquivo de trace.
Causa:
Tamanho de campo definido na propriedade SQL-WIDTH é inferior aos dados armazenados no campo.
Tratava-se de um campo do tipo ARRAY, um EXTENT do Progress com 2 posições.
Isoladamente, cada posição do array não ultrapassava o tamanho, porém somando o tamanho de todas as posições ultrapassava.
É exatamente esse o comportamento do comando SELECT sobre um campo EXTENT, ele concatena todas as posições e retorna para o client.
Solução:
Ajustar o tamanho do campo com a ferramenta DBTOOL, opção 2 (SQL Width Scan w/Fix Option).
Paliativo:
É possível passar uma diretiva para a conexão JDBC pedindo para truncar os valores que são maiores que o tamanho definido na propriedade SQL-WIDTH.
Entretanto, por motivos óbvios, o resultado não será completo para esses casos.
Adicionar o parâmetro "truncateTooLarge=on" no final da string de conexão, exemplo:
jdbc:datadirect:openedge://<servidor>:<porta>;databaseName=<banco>;truncateTooLarge=on;