1

Ich verwende NHibernate in meiner ASP.NET-Anwendung, um eine Verbindung zu einer MS SQL Server 2005-Datenbank herzustellen. In einigen Fällen muss ich meine eigenen SQL-Abfragen schreiben. Allerdings bemerkte ich, dass der SQL Server-Thread etwa 50 KB Speicher Lecks jedes Mal, wenn ich das folgende Stück Code ausführen:Speicherverlust bei Verwendung der Zeit in NHibernate SQL-Abfrage

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(); 

Wenn ich in Windows Task-Manager sehe ich sehe, dass der Prozess sqlservr.exe erhöht die Speichernutzung durch 50 KB jedes Mal, wenn ich diesen Code ausführen.

Hier ist der wirklich interessante Teil. Wenn ich im obigen Code "yyyy-MM-dd HH:mm:ss" durch "yyyy-MM-dd HH:mm" ersetze (d. H. Ich entferne die Sekunden), werden die Speicherlecks gestoppt.

Update: Anscheinend die Speicherlecks nicht wirklich aufhören. Sie zeigen nur einmal pro Minute. Vermutlich wenn sich die SQL-Abfrage ändert.

Die zurückgegebenen Ergebnisse sind in beiden Fällen identisch.

Hat jemand eine Ahnung, was hier vor sich geht?

+0

Können Sie erklären, wie Sie zu der Schlussfolgerung gekommen sind, dass SQL Server undicht ist? –

+0

Wenn ich in Windows-Task-Manager sehe, sehe ich, dass der Prozess sqlservr.exe seine Speicherauslastung bei jeder Ausführung dieses Codes um 50 KB erhöht. Das habe ich auch zu der Frage hinzugefügt. –

Antwort

2

a) In dem Beispiel, in dem Sie die NHibernate-Sitzung nicht ordnungsgemäß verteilen, bleibt die Verbindung zur Datenbank bestehen.

Verwenden Sie() {} statemenet oder versuchen Sie {} cath {} finally {}, um die Verbindung ordnungsgemäß zu schließen.

b) SQL-Befehl, den Sie geschrieben haben, verwenden keine SQL-Parameter, so SQL Server wird dies als einen neuen Befehl jedes Mal sehen - genauer gesagt jede Sekunde (oder wenn Sie entfernen: ss Teil, dann jede Minute) . Verwenden Sie SQL-Parameter (wie NHibernate bei Verwendung von HQL, Kriterien oder QBE-Abfragen), und es wird ordnungsgemäß mit weniger Speicherverbrauch zwischengespeichert.

Hoffe das hilft;)

+0

Ich stimme zu, dass ich die Sitzung wahrscheinlich schließen sollte. Ich werde es mir ansehen. In diesem Fall spielte es jedoch keine Rolle. Aber ich schrieb die Abfrage mit HQL um, und das behob das Problem. Danke vielmals. –

+0

Froh, Ihnen zu helfen;) – nihique

2

Sie haben dem Prozedur-Cache möglicherweise einen Abfrageplan hinzugefügt?

sqlservr.exe nimmt Speicher und wird nicht freigegeben, es sei denn, wenn andere Anwendungen es erfordern. Daher sind DB-Server eigenständig und nicht universell einsetzbar.

From BOL: Dynamic Memory Management

Auf einem 32-Bit-PC mit 2 GB RAM, SQL Server 2000 wird max out raubend 1,7 GB RAM. Es gibt einen KB-Artikel, der dies beschreibt.

In diesem Fall geben Sie implizit den Typ "datetime" anstelle des Typs "smalldatetime" an. Dies kann sich auf Ihren Abfrageplan auswirken. Sie können eine implizite Konvertierung für "a.deactivationtime" haben

+0

Danke für die Informationen zur Speichernutzung. Es beruhigte mich, vielleicht war das nicht so ein großes Problem, wie ich zuerst dachte. –