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?

Foi útil?

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

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