Exceção de tempo limite quando o tempo limite definido para um tempo infinito
-
27-09-2019 - |
Pergunta
No meu aplicativo C# .NET 3.5, estou usando o CastleProject ActiveRecord sobre o Nibernate. Este é um aplicativo de desktop usando o MS SQL Server 2008. Definei o tempo limite do comando ADO para 0 para impedir a exceção do tempo limite durante as operações em massa:
<activerecord>
<config>
...
<add key="hibernate.command_timeout" value="0" />
</config>
</activerecord>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
<session-factory>
...
<property name="command_timeout">0</property>
</session-factory>
</hibernate-configuration>
No entanto, ainda estou recebendo exceção de tempo limite! O log de Nibernate mostra algo assim:
Em algum lugar no começo:
2010-10-02 06: 29: 47.746 info Nibernate.driver.driverbase-Configurando o tempo limite do comando ADO.NET para 0 segundos
Em algum lugar no final:
2010-10-02 07: 36: 03.020 Debug Nhibernate.adonet.abstractbatcher-fechado IDBCommand, aberto iDBCommand s: 0 07-10-02 07: 36: 03,382 Erro não pode servir. Com a sessão Nibernate.HibernateException: ocorreu uma exceção ao executar consultas em lote ---> system.data.s qlclient.sqLexception: Timeout expirou. O período de tempo limite decorrido antes da conclusão da operação ou do servidor não está respondendo. em system.data.sqlclient.sqlconnection.onerror (exceção sqlexception, boolean breakconnection)
Por quê? Como consertar isto?
Solução
É correto que um valor 0 indique nenhum tempo limite (como definido nos documentos do MSDN), no entanto, enquanto O motorista do Nibernate passa o valor de configuração para o comando db quando estiver> = 0, a condição do Batcher verifica se o valor é> 0.
Portanto, quando você define o lote, com um valor de tempo limite 0, o valor não é transportado para o comando db para que ele permaneça como padrão.
É inteiramente possível que isso seja por design e que os desenvolvedores de Nibernate incapacitem intencionalmente os times desativados para cenários de lotes. Desativar o tempo limite é uma má idéia de qualquer maneira, se você tiver problemas com erros de tempo limite, eu aumentaria o valor, mas não o desativaria.
Confirme isso com os desenvolvedores Nibernate.
Outras dicas
Você pode definir o tempo limite para consultas específicas e não no nível Web.config (caso contrário, você realmente precisará ajustar seu aplicativo :)).
Recentemente, encontrei esta resposta que me ajudou:
Como definir o tempo limite do comando linq nibernate usando session.Query