应用程序设计 - ServiceStack; OrmLite.MySql; Funq;的IDbConnection;石英

时间:2015-12-07 16:52:07

标签: c# web-services servicestack quartz.net funq

我们有一个 ServiceStack 服务(API),它提供使用 AppSelfHostBase 托管的HTTP端点。 这些服务稍后使用 ServiceStack.OrmLite.MySql 查询数据库。所有方法都使用 async / await pattern 实现。数据库连接使用请求重用范围手动注册到Funq,并注入基本DAL类的属性。

只有HTTP请求才能访问此服务时,这一切都正常。 我们有另一个调用此API的Windows服务。由于它们可以托管在同一台服务器上,因此我们已经实现了本地 IRestClientAsync 来包装服务调用,因此可以将API服务方法加载到Windows服务中,并进行访问更有效率(例如1200 req / sec,而400 req / sec)。此Windows服务有许多线程同时运行。 通过这样做,我们打破了请求生命周期并且正在进行

  

“已经有一个与此Connection关联的开放DataReader,必须先关闭它。”

错误。我们尝试使用自定义连接提供程序手动处理此操作,使用ThreadLocalCallContext通过线程分隔连接。这并不是一直有效。 我们尝试通过手动调用SetOnBeginRequest(null);来处理请求生命周期,但性能不佳(接近HTTP调用),并且还有“打开DataReader”错误。

我们使用OnEndRequest();选项,因为线程是从 Quartz .NET 作业实例化的。

什么是管理数据库连接的最佳解决方案?我们能否使当前的解决方案可靠地运行?

1 个答案:

答案 0 :(得分:0)

我要做的第一件事就是不要使用Async API和MySql,因为它最终会在幕后创建新的线程来伪造异步,这使得它更少高效然后使用Sync API。您也无法使用具有相同数据库连接的多个读取器,最终会抛出此异常。

所以我首先回到使用带有MySql的同步API,如果它仍然是一个问题,使用瞬态范围(即没有重复使用)而不是请求范围并让db连接池完成它的工作。请求范围持续时间更长,占用的资源超过了必要的数量。