1

J'utilise NHibernate dans mon application ASP.NET pour se connecter à une base de données MS SQL Server 2005. Dans certains cas, j'ai besoin d'écrire mes propres requêtes SQL. Cependant, je remarque que le fil du serveur SQL fuites environ 50 Ko de mémoire à chaque fois que j'exécute le morceau de code suivant:Fuite de mémoire lors de l'utilisation du temps dans NHibernate requête SQL

NHibernate.ISession session = NHibernateSessionManager.Instance.GetSession(); 

ISQLQuery query = session.CreateSQLQuery(
    "select {a.*} from t_alarm a where a.deactivationtime > '" + 
    DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss") + 
    "'"); 

query.AddEntity("a", typeof(TAlarm)); 
System.Collections.IList aList = query.List(); 

Quand je regarde dans le gestionnaire de tâches de Windows, je vois que le processus sqlservr.exe augmente son utilisation de la mémoire 50 Ko chaque fois que je lance ce code.

Voici la partie vraiment intéressante. Si I, dans le code ci-dessus, remplacer "yyyy-MM-dd HH:mm:ss" avec "yyyy-MM-dd HH:mm" (à savoir je supprimer les secondes), la fuite de mémoire cessent.

Mise à jour: Apparemment, les fuites de mémoire ne s'arrêtent pas réellement. Ils montrent juste une fois par minute à la place. Vraisemblablement lorsque la requête SQL change.

Les résultats retournés sont les mêmes dans les deux cas.

Quelqu'un a-t-il une idée de ce qui se passe ici?

+0

pouvez-vous expliquer comment vous êtes arrivé à la conclusion que SQL Server fuit? –

+0

Quand je regarde dans le gestionnaire de tâches de Windows, je vois que le processus augmente Sqlservr.exe son utilisation de la mémoire de 50 Ko chaque fois que je lance ce code. J'ai ajouté cela à la question également. –

Répondre

2

a) Dans l'exemple, vous ne disposez pas correctement de la session de NHibernate, donc la connexion à DB est laissée ouverte.

Utilisez() {} statemenet ou essayez {} cath {} finally {} pour fermer correctement la connexion. B) La commande SQL que vous avez écrite n'utilise pas les paramètres SQL, ainsi SQL Server la verra comme une nouvelle commande chaque fois que vous l'exécutez - plus précisément chaque seconde (ou si vous supprimez: ss part, puis chaque minute) . Utilisez les paramètres SQL (comme NHibernate faire lorsque vous utilisez HQL, critères ou QBE Quering) et il sera correctement mises en cache avec moins de consommation de mémoire.

Espérons que cela aide;)

+0

Je suis d'accord que je devrais probablement fermer la session. Je vais regarder dedans. Cependant, cela n'a fait aucune différence dans ce cas. Mais j'ai réécrit la requête en utilisant HQL, et cela a corrigé le problème. Merci beaucoup. –

+0

Content de vous aider;) – nihique

2

vous avez ajouté un plan de requête dans le cache de procédure, peut-être?

sqlservr.exe prend la mémoire et ne la libère pas à moins que cela ne soit nécessaire lorsque d'autres applications le requièrent. Les serveurs DB sont donc autonomes et non polyvalents.

From BOL: Dynamic Memory Management

Sur un PC 32 bits avec 2 Go de RAM, SQL Server 2000 max sur la consommation de 1,7 Go de RAM. Il y a un article de KB qui décrit ceci.

Dans ce cas, en fournissant des secondes, vous indiquez implicitement le type "datetime", plutôt que le type "smalldatetime". Cela peut affecter votre plan de requête. Vous pouvez avoir une conversion implicite sur "a.deactivationtime"

+0

Merci pour les informations sur l'utilisation de la mémoire. Cela m'a fait me sentir plus calme, peut-être que ce n'était pas un gros problème comme je l'ai d'abord pensé. –