Changement De NHibernate Session.Enregistrer la commande timeout
Nous avons un couple de long cours d'exécution en arrière-fin de processus qui prennent plus de temps que la valeur par défaut de 30 secondes.
Notre NHibernate version est 2.0.1.4000 et Spring.NET est 1.2.0.20313.
NHibernate est configuré par le biais de Spring.NET de cette façon:
<object id="SessionFactory" type="Spring.Data.NHibernate.LocalSessionFactoryObject, Spring.Data.NHibernate20">
<property name="DbProvider" ref="DbProvider"/>
<property name="MappingAssemblies">
<list>
<value>SomeKindOfAnItem</value>
</list>
</property>
<property name="HibernateProperties">
<dictionary>
<entry key="expiration" value="120"/>
<entry key="adonet.batch_size" value="10"/>
<entry key="cache.provider_class" value="NHibernate.Caches.SysCache.SysCacheProvider, NHibernate.Caches.SysCache"/>
<entry key="cache.use_query_cache" value="true"/>
<entry key="connection.driver_class" value="NHibernate.Driver.SqlClientDriver"/>
<entry key="connection.provider" value="NHibernate.Connection.DriverConnectionProvider"/>
<entry key="dialect" value="NHibernate.Dialect.MsSql2005Dialect"/>
<entry key="current_session_context_class" value="Spring.Data.NHibernate.SpringSessionContext, Spring.Data.NHibernate20"/>
<entry key="show_sql" value="false"/>
</dictionary>
</property>
</object>
Pour contourner ce problème, je suis en train de mettre la NHibernate command_timeout à 60 ans dans le Web.config.
C'est à partir du Web.config:
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
<session-factory>
<property name="command_timeout">60</property>
</session-factory>
</hibernate-configuration>
Malheureusement cela ne fonctionne pas, la commande s'éteint après 30 secondes.
J'ai construit une application console qui appelle la DAO comme la web app t-il. J'ai exactement le même NHibernate paramètre de configuration dans le fichier de configuration. Le IDbCommand après 60 secondes au lieu de 30, à l'aide du paramètre avec succès à partir du fichier de configuration.
J'ai essayé de débogage de l'application et vérifier si le commandTimeout a été défini lors de la DAO assemblée est appelée à partir du site web. Il était.
C'est à partir de Visual Studio watch:
((NHibernate.Le pilote.DriverBase)(((NHibernate.Connexion.DriverConnectionProvider)
((NHibernate.Impl.SessionFactoryImpl)session.SessionFactory)
.ConnectionProvider).Le pilote)).commandTimeout: 60
La session est créée comme ceci:
ISession session = SessionFactoryUtils.GetSession(HibernateTemplate.SessionFactory, true);
Ma question est: si la commande champ délai d'expiration a été correctement fixé à 60 à partir de mon site Web.config, pourquoi est-il au bout de 30 secondes? Toutes les idées que je pourrais essayer?
Excellente idée, mais je l'ai déjà. J'ai construit une application console pour reproduire le problème, mais l'application console qui fonctionne et la web app ne fonctionne pas.
OriginalL'auteur adomokos | 2010-02-24
Vous devez vous connecter pour publier un commentaire.
Vous pouvez définir le délai d'attente dans le cadre de la mise en veille prolongée.connexion.connection_string de la propriété. Je n'ai pas utilisé Spring.Net donc, je ne suis pas sûr de savoir comment il met en place le NHibernate session de l'usine. Si vous êtes en mesure d'ajouter un "Délai de connexion=120" pour la chaîne de connexion. Cela devrait augmenter le temps de la valeur par défaut de 30 secondes délai de 120 secondes.
La ligne suivante qui va dans le
web.config
:MODIFIER
Il s'avère qu'il y a en fait deux délais d'attente. Grâce à adomokos pour le pointage. Une pour l'ouverture de la connexion et un autre pour les requêtes qui sont exécutées.
L'un pour la connexion est affiché au-dessus, mais pour définir le délai d'attente pour une requête avec NHibernate vous utilisez le
ICriteria
interface.La valeur de délai d'expiration est en secondes.
Espère que ça aide
Doh.. Vous avez raison. J'ai choisi le mauvais
Avez-vous essayé le SetTimeout sur le ICriteria Interface? ce qui est probablement ce que vous êtes réellement après.
Je ne suis pas sûr d'avoir accès à ICriteria. Je suis en train d'enregistrer l'objet à travers HibernateTemplate: HibernateTemplate.SaveOrUpdate(entité); HibernateTemplate.Flush();
Si vous avez l'objet de session, alors vous pouvez en créer un à l'aide de critères de Session.CreateCriteria. Je vais modifier ma réponse à l'expliquer davantage.
OriginalL'auteur