3

Dans mon application C# .NET 3.5, j'utilise CastleProject ActiveRecord sur NHibernate. C'est une application de bureau en utilisant MS SQL Server 2008. J'ai définir le délai de commande ADO à 0 pour éviter de dépassement de délai lors des opérations en vrac:Exception de délai d'expiration lorsque le délai d'attente est défini sur l'heure infinie

<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> 

Cependant, je reçois encore de dépassement de délai! Le journal NHibernate montre quelque chose comme ceci:

Quelque part au début:

2010-10-02 06: 29: 47746 INFO NHibernate.Driver.DriverBase - réglage de délai d'attente de commande ADO.NET à 0 secondes

Quelque part à la fin:

2010-10-02 07: 36: 03.020 DEBUG NHibernate.AdoNet.AbstractBatcher - Fermé IDbCommand, ouvert IDbCommand s: 0 2010-10-02 07: 36: 03382 erreur NHibernate.Event.Default.AbstractFlushingEventListener - Impossible syn état de base de données chronize avec la session NHibernate.HibernateException: Une exception a eu lieu lors de l'exécution requêtes par lots ---> System.Data.S qlClient.SqlException: le délai a expiré. Le délai écoulé s'est écoulé avant la fin de l'opération ou le serveur ne répond pas. à System.Data.SqlClient.SqlConnection.OnError (SqlException exception, Boolean breakConnection)

Comment venir? Comment régler ceci?

+0

cette application web je suppose? – hardba11

+0

Désolé, n'a pas déclaré cela. Non, c'est une application de bureau ordinaire. – Alex

+0

Utilisez-vous le traitement par lots ('adonet.batch_size'> 0)? Pourquoi avez-vous une configuration ActiveRecord * et * une configuration NHibernate séparée? Quel type d'instruction SQL expire (mise à jour/insertion/sélection/suppression)?Quelle version de NHibernate et ActiveRecord utilisez-vous? –

Répondre

5

Il est correct qu'une valeur de 0 indique aucun délai d'attente (comme defined in the MSDN docs), cependant pendant NHibernate's driver passes the config value to the db command when it's >= 0, la condition du contrôleur checks that the value is > 0. Par conséquent, lorsque vous définissez le traitement par lots avec une valeur de délai d'attente de 0, la valeur n'est pas reportée sur la commande db et reste par défaut.

Il est tout à fait possible que ce soit par nature, et que les développeurs de NHibernate aient intentionnellement désactivé la désactivation des délais d'attente pour les scénarios par lots. Désactiver le timeout est de toute façon une mauvaise idée, si vous avez des problèmes avec les erreurs de timeout, je augmenterais la valeur, mais je ne la désactiverais pas.

Veuillez confirmer cela avec les développeurs NHibernate.

+0

Merci, Mauricio! – Alex

+0

J'ai essayé d'augmenter le temps d'attente (de 1000 à 10000) et la taille de lot diminuée (de 1000 à 100), maintenant j'obtiens l'exception NHibernate.TransactionException: La transaction n'est pas reliée, ou a été déconnectée sur l'endroit assez aléatoire de mes opérations par lots. Pourquoi? – Alex

+0

Hm ... Je reçois une fois de plus l'exception de timeout, ce qui est impossible pour une valeur aussi longue. Un de mes amis m'a dit que Nhibernate TransactionScope que j'utilise n'utilise pas le timeout personnalisé. Savez-vous une solution de contournement pour remplir timeout à partir du fichier de configuration à TransactionScope? – Alex