ORA-03113: fim-de-arquivo no canal de comunicação depois de longa inatividade em ASP.Net aplicativo

StackOverflow https://stackoverflow.com/questions/83068

Pergunta

Eu tenho um ASP.Net 2.0 aplicativo (não usar estado de sessão) com balanceamento de carga em IIS5 correndo de volta para o servidor de um único Oracle 10g, usando a versão 10.1.0.301 do ODAC / ODP.Net motoristas. Depois de um longo período de inatividade (algumas horas), a aplicação, aparentemente de forma aleatória, irá lançar uma exceção Oracle:

Exceção: ORA-03113: fim-de-arquivo no canal de comunicação na Oracle.DataAccess.Client.OracleException.HandleErrorHelper (Int32 errCode, OracleConnection conexão, IntPtr opsErrCtx, OpoSqlValCtx * pOpoSqlValCtx, src objecto, procedimento de cadeia) em Oracle.DataAccess.Client.OracleCommand.ExecuteReader (Boolean requery, Booleano fillRequest, comportamento CommandBehavior) a Oracle.DataAccess.Client.OracleCommand.System.Data.IDbCommand.ExecuteReader ()

... parte do Oracle das extremidades da pilha aqui ...

Estamos criando novas conexões em cada solicitação, temos o fechamento conexão adequada abrir e fechar envolto em um try / catch / finally para garantir, ea coisa toda é envolvida em um usando (OracleConnection yadayada) {...} bloco . Este problema não surgem associados à reinicialização do aplicativo ASP.Net depois de ser girado para baixo por inatividade.

Ainda temos que reproduzir o problema nós mesmos. Pensamentos, orações, ajuda?


Mais:. verificado com ele, o firewall não está definido para matar conexões entre esses servidores

Foi útil?

Solução

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

O banco de dados informando que a conexão de rede não existe mais. Isto poderia ser porque:

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

Para 1) ( firewall ) busque tahiti.oracle.com para SQLNET.EXPIRE_TIME. Este é um parâmetro sqlnet.ora que vai enviar regularmente um pacote de rede em um configurável intervalo ou seja:. Definir isso fará com que o firewall acreditam que a conexão é ao vivo

Para 1) ( Rede ) falar com o seu administrador de rede (conexão pode não ser confiável)

Para 2) Verifique a alert.log para erros. Se o processo do servidor não haverá uma mensagem de erro. Além disso, um arquivo de rastreamento terá sido escrito para ativar o suporte para identificar o problema. A mensagem de erro irá referenciar o arquivo de rastreamento.

questões de suporte podem ser levantadas em metalink.oracle.com com um cliente adequado Serviço Identifier (CSI)

Outras dicas

Adicionar Validar Connection = true para a cadeia de ligação.

neste blog para encontrar mais sobre.

DETALHES: Depois OracleConnection.Close () a conexão do banco de dados real não terminar. O objeto de conexão é colocada de volta no pool de conexão. O uso de pool de conexão está implícito por ODP.NET. Se você criar uma nova conexão que você começa um dos piscina. Se essa conexão é "ainda aberto" o método OracleConnection.Open () realmente não se cria uma nova conexão. Se a conexão real é quebrado (por qualquer motivo), obtém uma falha na primeira escolha, atualizar, inserir ou excluir.

Com Validar Connection a conexão real é validado em Open () método.

Verifique se não há um firewall que está terminando a conexão após determinado período de tempo (esta foi a causa de um problema semelhante que teve)

fim-de-arquivo no canal de comunicação:

Uma das decorrer deste erro é devido ao banco de dados falhar para escrever o log quando o seu na etapa de abertura;

Solução verificar o banco de dados se a sua execução em ARCHIVELOG ou NOARCHIVELOG

para verificar o uso

select log_mode from v$database;

Se seu sobre ARCHIVELOG tentar mudar em NOARCHIVELOG

usando sqlplus

  • startup mount
  • noarchivelog alter database;
  • alter database aberto;

se ele funciona para este

Em seguida, você pode ajustar sua área flashrecovery seu possivelmente que a sua área flashrecovery está cheio ->, em seguida, depois de confirmar que a sua área flashrecovery tem o espaço que você pode alterar seu banco de dados para o ARCHIVELOG

Esta mensagem de erro pode ser jogado nos logs de aplicação quando o problema real é que o servidor de banco de dados oracle ficou sem espaço.

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

Você poderia tentar este corte do registro:

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

Se ele funciona, basta manter o aumento da KeepAliveTime. Ele está definido para 2 minutos.

O artigo anteriormente mencionado é bom. http://forums.oracle.com/forums/thread.jspa?threadID= 191750 (tanto quanto ele vai)

Se isto não é algo que é executado com freqüência (não fazê-lo em seu home page), você pode desativar o pool de conexão.

Há uma outra "pegadinha" que não é mencionado no artigo. Se a primeira coisa que você tentar fazer com que a conexão é chamar um procedimento armazenado, ODP irá travar !!!! Você não terá de volta uma condição de erro de gerir, apenas uma passagem plena pendurar! A única maneira de corrigi-lo é desligar o pool de conexão. Uma vez que fizemos isso, todas as questões foram embora.

Pooling é bom em algumas situações, mas à custa de maior complexidade em torno da primeira declaração de cada conexão.

Se a abordagem de tratamento de erros é tão bom, por que não torná-lo uma opção para ODP para lidar com isso para nós ????

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top