在 NancyFx 应用程序中请求结束后,数据库连接未关闭
DB connection is not closed after request ends in a NancyFx application
我正在构建 Nancy 网络应用程序,并使用 OrmLite 进行数据库访问。我注意到每个请求都会打开一个新的数据库连接并且不会关闭它。我认为在应用程序容器中注册 OrmLiteConnection class 会使它成为应用程序范围的,但看起来我遗漏了什么。
这是我的代码(在 ConfigureApplicationContainer
中):
container.Register<OrmLiteConnectionFactory>(new OrmLiteConnectionFactory(connectionString, SqlServerDialect.Provider));
container.Register<OrmLiteConnection>(
(cContainer, overloads) => (OrmLiteConnection) cContainer.Resolve<OrmLiteConnectionFactory>().Open());
您需要在注册中添加 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()
,那么您可能需要找到某种方式来提供可以在那时执行的委托。
我将 OrmLiteConnection
的注册移到了 ConfigureRequestContainer
。然后我覆盖 RequestStartup
并添加:
pipelines.AfterRequest += (ctx) => {
//close the connection
container.Resolve<OrmLiteConnection>().Dispose();
};
我正在构建 Nancy 网络应用程序,并使用 OrmLite 进行数据库访问。我注意到每个请求都会打开一个新的数据库连接并且不会关闭它。我认为在应用程序容器中注册 OrmLiteConnection class 会使它成为应用程序范围的,但看起来我遗漏了什么。
这是我的代码(在 ConfigureApplicationContainer
中):
container.Register<OrmLiteConnectionFactory>(new OrmLiteConnectionFactory(connectionString, SqlServerDialect.Provider));
container.Register<OrmLiteConnection>(
(cContainer, overloads) => (OrmLiteConnection) cContainer.Resolve<OrmLiteConnectionFactory>().Open());
您需要在注册中添加 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()
,那么您可能需要找到某种方式来提供可以在那时执行的委托。
我将 OrmLiteConnection
的注册移到了 ConfigureRequestContainer
。然后我覆盖 RequestStartup
并添加:
pipelines.AfterRequest += (ctx) => {
//close the connection
container.Resolve<OrmLiteConnection>().Dispose();
};