我把头发拉过似乎是记忆泄漏的东西,但我找不到原因:(
我在我自己的电脑上构建了一个应用程序,非常重的野兽,有很多内存,所以我从来没有意识到我的进程消耗了太多的内存。我在将代码发布到内存有限的生产环境后才意识到。
我使用了很多不同的技术和模式,包括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
很抱歉,如果这是一个新手问题,但我现在已经在谷歌上搜索了一个多星期了:(
谢谢!
Seb:)
答案 0 :(得分:4)
我是一个菜鸟,确实我不应该每次创建一个新的会话工厂,而是使用现有的工厂。导致我走向错误方向的是最初我的代码托管在WCF服务中,我认为每次都必须创建一个新工厂。
我现在确保整个代码中只存在一个工厂,并且内存消耗是稳定的。
答案 1 :(得分:1)
您正在创建1000000 Hibernate会话对象,为什么要创建这些会话对象只需创建1个会话对象,并仅使用1个会话对象运行查询。