2009-06-18 11 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的怪责功能并没有提供太多的信息:(

相关问题