it-swarm-pt.tech

ORA-03113: fim do arquivo no canal de comunicação após longa inatividade no aplicativo ASP.Net

Eu tenho um aplicativo ASP.Net 2.0 com balanceamento de carga (sem usar o estado da sessão) no IIS5, executando novamente em um único servidor Oracle 10g, usando a versão 10.1.0.301 dos drivers ODAC/ODP.Net. Após um longo período de inatividade (algumas horas), o aplicativo, aparentemente aleatoriamente, lançará uma exceção do Oracle:

Exceção: ORA-03113: fim do arquivo no canal de comunicação no Oracle.DataAccess.Client.OracleException.HandleErrorHelper (int32 errCode, OracleConnection conn, IntPtr opsErrCtx, OpoSqlValCtx * pOpoSqlValCtx, Object src.DocAcAc. .OracleCommand.ExecuteReader (requisição booleana, fillRequest booleana, comportamento CommandBehavior) em Oracle.DataAccess.Client.OracleCommand.System.Data.IDbCommand.ExecuteReader ()

... parte Oracle da pilha termina aqui ...

Estamos criando novas conexões a cada solicitação, abrimos e fechamos um try/catch /, finalmente, para garantir o fechamento adequado da conexão, e tudo está envolvido em um bloco using (OracleConnection yadayada) {...}. Esse problema não aparece vinculado à reinicialização do aplicativo ASP.Net após ser desativado por inatividade.

Ainda temos que reproduzir o problema. Pensamentos, orações, ajuda?


Mais: Verificado com a TI, o firewall não está configurado para eliminar conexões entre esses servidores.

23
Greg Hurlman

ORA-03113: fim do arquivo no canal de comunicação

O banco de dados está informando que a conexão de rede não existe mais? Isso pode ser porque:

  1. Um problema de rede - conexão incorreta ou problema de firewall
  2. O processo do servidor no banco de dados que está atendendo você morreu inesperadamente.

Para 1) (firewall) pesquise tahiti.Oracle.com por SQLNET.EXPIRE_TIME. Este é um parâmetro sqlnet.ora que envia regularmente um pacote de rede em um intervalo configurável, ou seja: definir isso fará o firewall acreditar que a conexão está ativa.

Para 1) (rede) fale com o administrador da rede (a conexão pode não ser confiável)

Para 2) Verifique o alert.log por erros. Se o processo do servidor falhar, haverá uma mensagem de erro. Além disso, um arquivo de rastreamento será gravado para permitir que o suporte identifique o problema. A mensagem de erro fará referência ao arquivo de rastreamento.

Os problemas de suporte podem ser levantados em metalink.Oracle.com com um CSI (Customer Service Identifier) ​​adequado

19
mathewbutler

Adicione Valide Connection = true à sua cadeia de conexão.

Veja este blog para saber mais.

DETALHES: Após o OracleConnection.Close (), a conexão real com o banco de dados não termina. O objeto de conexão é colocado novamente no conjunto de conexões. O uso do pool de conexões está implícito no ODP.NET. Se você criar uma nova conexão, receberá um do pool. Se essa conexão "ainda estiver aberta", o método OracleConnection.Open () não criará realmente uma nova conexão. Se a conexão real estiver interrompida (por qualquer motivo), ocorrerá uma falha na primeira seleção, atualização, inserção ou exclusão.

Com Validar conexão, a conexão real é validada no método Open ().

8
Christian13467

Verifique se não há um firewall que esteja encerrando a conexão após certo período de tempo (essa foi a causa de um problema semelhante que tivemos)

5
hamishmcn

fim de arquivo no canal de comunicação:

Um dos erros desse erro ocorre devido à falha do banco de dados em gravar o log quando este está no estágio de abertura;

Solução, verifique o banco de dados se estiver em execução no ARCHIVELOG ou NOARCHIVELOG

para verificar o uso

select log_mode from v$database;

se estiver em ARCHIVELOG tente mudar para NOARCHIVELOG

usando sqlplus

  • montagem de inicialização
  • alterar banco de dados noarchivelog;
  • alterar banco de dados aberto;

se funcionar para isso

Em seguida, você pode ajustar sua área de recuperação de flash e possivelmente sua área de recuperação de flash está cheia -> depois de confirmar que sua área de recuperação de flash tem espaço, você pode alterar seu banco de dados para ARCHIVELOG

4
Mathias Stanley

Essa mensagem de erro pode ser lançada nos logs do aplicativo quando o problema real é que o servidor de banco de dados Oracle ficou sem espaço.

Depois de corrigir o problema de espaço, essa mensagem de erro específica desapareceu.

3
Rajesh

Você pode tentar este registro hackear:

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters]
"DeadGWDetectDefault"=dword:00000001
"KeepAliveTime"=dword:00120000

Se funcionar, continue aumentando o KeepAliveTime. Atualmente, está definido para 2 minutos.

2
Ken Wren

O artigo mencionado anteriormente é bom. http://forums.Oracle.com/forums/thread.jspa?threadID=19175 (na medida do possível)

Se isso não for algo que é executado com frequência (não faça isso na sua página inicial), você pode desativar o pool de conexões.

Há outra "pegadinha" que não é mencionada no artigo. Se a primeira coisa que você tentar fazer com a conexão for chamar um procedimento armazenado, o ODP PENDERÁ !!!! Você não receberá uma condição de erro para gerenciar, apenas um HANG de diâmetro máximo! A única maneira de corrigi-lo é desativar o pool de conexões. Depois disso, todos os problemas desapareceram.

O pool é bom em algumas situações, mas ao custo de maior complexidade em torno da primeira declaração de cada conexão.

Se a abordagem de tratamento de erros é tão boa, por que eles não fazem uma opção para o ODP manipular isso para nós ????

0
Brad Bruce