1

単体テストと統合テストのプロファイリングを行っていますが、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() { }
}
4

1 に答える 1

0

Sybase データベースへのアクセス中に同じ問題が発生します。理由はわかりませんが、それが本当に問題の原因なのかはわかりませんが\NHibernate\Transaction\AdoTransaction.cs、オブジェクトのクローズ/破棄に関連するコード (307 ~ 311 行目) の一部がしばらく無効になっているようです。残念ながら、SVN の Blame 機能はあまり多くの情報を提供しません :(

于 2009-11-12T14:34:41.600 に答える