4

我把头发拉到似乎是内存泄漏的地方,但我找不到原因:(

我在自己的 PC 上构建了一个应用程序,这是一个拥有大量内存的重型野兽,所以我从未意识到我的进程消耗了这么多内存。我是在将代码发布到内存有限的生产环境后才意识到的。

我使用了很多不同的技术和模式,包括 WCF,但我现在已经到了我剥离大部分代码以找出消耗这么多内存的地步......

这是应用程序的最简化版本,1 个实体,1 个映射,以及一个从数据库中检索的简单程序,在它运行时,我可以看到任务管理器中的进程无限增长:

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 获得了第 3 方 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 回答