2009-06-18 14 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的怪責功能並沒有提供太多的信息:(

相關問題