【发布时间】:2016-03-12 08:53:33
【问题描述】:
我们有一个 ServiceStack 服务 (API),它提供使用 AppSelfHostBase 托管的 HTTP 端点。 这些服务稍后使用 ServiceStack.OrmLite.MySql 查询数据库。所有方法均使用 async / await 模式 实现。数据库连接手动注册到具有请求重用范围的 Funq,并注入到基 DAL 类的属性中。
当此服务仅由 HTTP 请求访问时,这一切正常。 我们有另一个调用此 API 的 Windows 服务。由于它们可以托管在同一台服务器上,我们实现了本地 IRestClientAsync 来包装服务调用,因此 API 服务方法可以加载到 Windows 服务并访问更有效(例如 1200 req/sec 与 400 req/sec 相比)。这个 Windows 服务有很多线程同时运行。 通过这样做,我们打破了请求生命周期并得到了
“已经有一个打开的 DataReader 与此 Connection 关联,必须先关闭。”
错误。我们尝试使用自定义连接提供程序手动处理此问题,使用 ThreadLocal 和 CallContext 通过线程分离连接。这并不是一直有效。
我们尝试通过手动调用 OnBeginRequest(null); 和 OnEndRequest(); 来处理请求生命周期,但性能很差(接近 HTTP 调用),并且出现“打开 DataReader”错误。
我们使用 RequestContext.UseThreadStatic 选项,因为线程是从 Quartz .NET 作业实例化的。
管理数据库连接的最佳解决方案是什么?我们能否使当前的解决方案可靠地工作?
【问题讨论】:
标签: c# web-services servicestack quartz.net funq