4

メモリリークのように見えるものに髪を引っ張っていますが、原因を見つけることができません:(

私は自分のPCでアプリケーションを構築しました。これは、大量のメモリを備えたかなり重い獣でした。そのため、自分のプロセスがこれほど多くのメモリを消費していることに気づきませんでした。限られたメモリの本番環境にコードをリリースして初めて気づきました。

私はWCFを含め、かなりの数の異なるテクノロジーとパターンを使用していますが、今ではほとんどのコードを削除して、何が非常に多くのメモリを消費しているかを調べるようになりました...

これは、アプリの最も単純化されたバージョン、1つのエンティティ、1つのマッピング、および実行中にDBから取得する単純なプロシージャであり、タスクマネージャーのプロセスが際限なく成長していることがわかります。

using System;
using System.Linq;
using FluentNHibernate.Cfg;
using FluentNHibernate.Cfg.Db;
using FluentNHibernate.Mapping;
using NHibernate;
using NHibernate.Linq;

namespace ConsoleApplication18
{
    public class Program
    {
        private static void Main()
        {
            var i = 0;

            while ( i < 1000000 )
            {
                ISession session = BuildSessionFactory().OpenSession();
                ITransaction transaction = session.BeginTransaction();
                var users = session.Query< User >().ToList();
                transaction.Commit();
                transaction.Dispose();
                transaction = null;
                session.Dispose();
                session = null;
                Console.WriteLine( users.Count );
                users = null;
                i++;
            }
        }

        private static ISessionFactory BuildSessionFactory()
        {
            return Fluently.Configure()
                .Database( MsSqlConfiguration
                               .MsSql2008
                               .ConnectionString( "Data Source=SEB-PC\\SEBPC;Initial Catalog=Nice;Integrated Security=True" ) )
                .Mappings( m => m.FluentMappings.AddFromAssemblyOf<User>() )
                .BuildSessionFactory();
        }
    }

    public class User
    {
        public virtual Guid Id { get; set; }
        public virtual string FirstName { get; set; }
        public virtual string LastName { get; set; }
        public virtual string Email { get; set; }
    }

    public class UserMap : ClassMap< User >
    {
        public UserMap()
        {
            Id( x => x.Id ).UnsavedValue( Guid.Empty );
            Map( x => x.FirstName )
                .Length( 50 )
                .Not.Nullable();
            Map( x => x.LastName )
                .Length( 50 )
                .Not.Nullable();
            Map( x => x.Email )
                .Length( 254 )
                .Not.Nullable()
                .Unique();
        }
    }
}

私は何か間違ったことをしていますか?

nugetを使用してサードパーティのDLLを入手しましたが、バージョンは次のとおりです。

  • FluentNHibernate:1.3.0.733

  • Iesi.Collections:1.0.1.0

  • NHibernate:3.3.1.4000

これが初心者の質問である場合は申し訳ありませんが、私は今一週間以上あちこちでグーグルしています:(

ありがとう!

セブ:)

4

2 に答える 2

5

私はそのような初心者です。実際、毎回新しいセッションファクトリを作成するのではなく、既存のセッションファクトリを使用する必要があります。私を間違った方向に導いたのは、元々私のコードがWCFサービスでホストされていたため、毎回新しいファクトリを作成する必要があると思っていたということです。

これで、コード全体に1つのファクトリのみが存在し、メモリ消費が安定していることを確認しました。

于 2012-08-19T19:55:44.143 に答える
2

1000000のHibernateセッションオブジェクトを作成していますが、なぜこれらの多くのセッションオブジェクトを作成するのに、1つのセッションオブジェクトを作成し、1つのセッションオブジェクトを使用してクエリを実行するのですか。

于 2012-08-19T14:33:00.207 に答える