Почему называется финализатор NHibernate AdoTransaction? - PullRequest
1 голос
/ 18 июня 2009

Я профилирую юнит-тесты и интеграционные тесты и обнаружил, что много времени тратится на финализатор NHibernate.Transaction.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() { }
}

1 Ответ

0 голосов
/ 12 ноября 2009

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

...