1

ASP.NETアプリケーションでNHibernateを使用して、MS SQL Server 2005データベースに接続します。場合によっては、独自のSQLクエリを作成する必要があります。しかし、私は、SQLサーバーのスレッドがメモリのおよそ50キロバイト、私は次のコードを実行するたびにリークしていることに気づいた:NHibernate 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(); 

を、私は、Windowsのタスクマネージャで見ると、私はプロセスがsqlservr.exeすることにより、そのメモリ使用量が増加していることがわかりこのコードを実行するたびに50 KB。

ここは本当に面白い部分です。上記のコードで、"yyyy-MM-dd HH:mm:ss""yyyy-MM-dd HH:mm"に置き換えた場合(つまり、秒を削除した場合)、メモリリークが停止します。

更新:明らかにメモリリークは実際には止まらない。彼らは代わりに1分に1回だけ表示します。おそらくSQLクエリが変更されたとき。

戻り値はどちらの場合も同じです。

ここで何が起こっているのか誰かが気付いていますか?

+0

SQL Serverが漏れているという結論にどのようになったのか説明できますか? –

+0

Windowsのタスクマネージャを見ると、このコードを実行するたびにプロセスsqlservr.exeのメモリ使用量が50KB増加することがわかります。私はその質問にもそれを加えました。 –

答えて

2

a) この例では、NHibernateのセッションを正しく処理していないため、DBへの接続は開いたままです。

(){} statemenetを使用するか、または{} cath {} finally {}を使用して正しく接続を終了してください。

b)あなたが書いたSQLコマンドはSQLパラメータを使用しないので、SQLサーバは実行するたびに新しいコマンドと見なします - より正確には毎秒(または、ss partを削除してから1分ごとに削除します) 。 SQLパラメータ(HQL、Criteria、QBE queringを使用する場合はNHibernate doなど)を使用すると、メモリ消費量を抑えて適切にキャッシュされます。

希望する;)

+0

私はおそらくセッションを閉じるべきであることに同意します。私はそれを徹底的に調べます。しかし、このケースでは何の違いもありませんでした。しかし、私はHQLを使ってクエリを書き直しました。問題を修正しました。どうもありがとう。 –

+0

よろしくお願いします。 – nihique

2

プロシージャキャッシュにクエリプランを追加しましたか?

sqlservr.exeはメモリを消費し、他のアプリケーションが必要としない限り、メモリを解放しません。したがって、DBサーバーはスタンドアロンであり、多目的ではありません。 2ギガバイトのRAM、SQL Server 2000の32ビットPC上で

From BOL: Dynamic Memory Management

は、最大うち1.7ギガバイトのRAMを消費します。これを説明するKB記事があります。

この場合、「smalldatetime」タイプではなく「datetime」タイプを暗示的に指定して秒を指定します。これはクエリプランに影響する可能性があります。 "a.deactivationtime"の暗黙的な変換がある可能性があります

+0

メモリ使用量情報をありがとう。それは私を穏やかに感じさせました、おそらくこれは私が最初に考えたような大きな問題ではなかったでしょう。 –

関連する問題