ORA-03113: fim-de-arquivo no canal de comunicação depois de longa inatividade em ASP.Net aplicativo
-
01-07-2019 - |
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
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:
- Um problema de rede - conexão com defeito ou problema de firewall
- 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 ????