【问题标题】:DB connection is not closed after request ends in a NancyFx application请求在 NancyFx 应用程序中结束后未关闭数据库连接
【发布时间】:2017-05-03 14:29:20
【问题描述】:

我正在构建一个 Nancy Web 应用程序,并使用 OrmLite 进行数据库访问。我注意到每个请求都会打开一个新的数据库连接并且不会关闭它。我认为在 Application 容器中注册 OrmLiteConnection 类会使其成为应用程序范围,但看起来我缺少一些东西。

这是我的代码(ConfigureApplicationContainer):

container.Register<OrmLiteConnectionFactory>(new OrmLiteConnectionFactory(connectionString, SqlServerDialect.Provider));
container.Register<OrmLiteConnection>(
            (cContainer, overloads) => (OrmLiteConnection) cContainer.Resolve<OrmLiteConnectionFactory>().Open());

【问题讨论】:

    标签: database-connection nancy tinyioc


    【解决方案1】:

    您需要将scope 添加到您的注册中:

    container
        .Register<OrmLiteConnectionFactory>(new OrmLiteConnectionFactory(connectionString, SqlServerDialect.Provider))
        .AsSingleton(); // I think this is by default, but sometimes being explicit is good.
    
    container
        .Register<OrmLiteConnection>(
            (cContainer, overloads) => (OrmLiteConnection) cContainer.Resolve<OrmLiteConnectionFactory>().Open())
        .AsPerRequestSingleton();;
    

    AFAIK,这将确保实例在作用域的末端被释放。因此,如果您需要做的不仅仅是Dispose(),那么您可能需要找到某种方式来提供可以在当时执行的委托。

    【讨论】:

    • 第一行不起作用——说,Nancy.TinyIoc.TinyIoCRegistrationException: Cannot convert current registration of Nancy.TinyIoc.TinyIoCContainer+InstanceFactory to singleton
    • 原来工厂方法与单例生命周期不兼容。一个已知的 TinyIoC 限制。
    • 啊。很高兴知道。
    【解决方案2】:

    我将OrmLiteConnection 的注册移动到ConfigureRequestContainer。然后我覆盖RequestStartup 并添加:

    pipelines.AfterRequest += (ctx) => {
        //close the connection
        container.Resolve<OrmLiteConnection>().Dispose();
    };
    

    【讨论】:

    • 这是正确的吗?当我尝试这个时,它会构造一个新实例(在我的例子中是一个 DbContext),然后立即释放它。
    • 我已在 ConfigureRequestContainer 中将其注册为单例。
    猜你喜欢
    • 2018-11-08
    • 1970-01-01
    • 2022-01-26
    • 2021-08-20
    • 1970-01-01
    • 2019-12-11
    • 1970-01-01
    • 2019-02-05
    • 1970-01-01
    相关资源
    最近更新 更多