2009-06-18 1 views
1

Я профилирую часть & интеграционных тестов, и я нахожу, что много времени тратится на финализатор NHibernate.Transaction.AdoTransaction - это означает, что он не правильно распределяется.Почему финализатор NHibernate AdoTransaction называется?

Я не использую AdoTransaction непосредственно в коде, поэтому он, вероятно, используется каким-либо другим объектом внутри NHibernate. Любая идея, что я забываю Утилизировать?

Вот мой текст арматура:

public abstract class AbstractInMemoryFixture 
{ 
    protected ISessionFactory sessionFactory; 
    protected ILogger Logger { get; private set; } 
    static readonly Configuration config; 
    private static readonly ISessionFactory internalSessionFactory; 

    static AbstractInMemoryFixture() 
    { 
     config = new NHibernateConfigurator().Configure(NHibernateConfigurators.SQLiteInMemory()); 
     internalSessionFactory = config.BuildSessionFactory(); 
    } 

    [SetUp] 
    public void SetUp() 
    { 
     const string sqliteInMemoryConnectionString = "Data Source=:memory:;Version=3;Pooling=False;Max Pool Size=1;"; 
     var con = new SQLiteConnection(sqliteInMemoryConnectionString); 
     con.Open(); 
     new SchemaExport(config).Execute(false, true, false, true, con, System.Console.Out); 
     var proxyGenerator = new ProxyGenerator(); 

     sessionFactory = proxyGenerator.CreateInterfaceProxyWithTarget(internalSessionFactory, new UseExistingConnectionInterceptor(con)); 
     Logger = new NullLogger(); 

     ExtraSetup(); 
    } 

    [TearDown] 
    public void TearDown() 
    { 
     var con = sessionFactory.OpenSession().Connection; 
     if (con != null) 
     { 
      if (con.State == ConnectionState.Open) 
       con.Close(); 
      con.Dispose(); 
     } 
    } 

    private class UseExistingConnectionInterceptor :IInterceptor 
    { 
     private readonly SQLiteConnection connection; 

     public UseExistingConnectionInterceptor(SQLiteConnection connection) 
     { 
      this.connection = connection; 
     } 

     public void Intercept(IInvocation invocation) 
     { 
      if (invocation.Method.Name != "OpenSession" || invocation.Method.GetParameters().Length > 0) 
      { 
       invocation.Proceed(); 
       return; 
      } 
      var factory = (ISessionFactory) invocation.InvocationTarget; 
      invocation.ReturnValue = factory.OpenSession(connection); 
     } 
    } 
    protected virtual void ExtraSetup() { } 
} 

ответ

0

У меня такая же проблема, в то время как доступ к базе данных Sybase. Я не знаю, почему, и если это действительно причина проблемы, но, похоже, некоторые из кода в \NHibernate\Transaction\AdoTransaction.cs (строки с 307 по 311), связанные с закрытием/удалением объекта, были отключены на некоторое время. К сожалению, виноватая особенность SVN не дает слишком много информации :(

Смежные вопросы