之前在 StackOverflow 中已经提出过这个问题,但根据我的经验,答案实际上是错误的。至少对于 .NET Framework 4.0 和 SQL Server 2005,它们是错误的。
我需要帮助才能一劳永逸地解决这个问题。
问题是 - 无状态 WCF 服务可以以某种方式使用数据库连接池吗?
较早的答案基本上表明与任何其他 ADO.NET 方案没有问题并且没有区别。但是,我一直无法获得无状态 WCF 服务来使用连接池,而我可以看到它总是在 WCF 服务之外工作。无论我尝试使用什么连接字符串或参数,它都不会这样做。
数据库连接池是默认启用的,所以一个简单的连接字符串应该可以让我到达那里,例如在 SQL Server Express 上:
SqlConnection sqlCn = new SqlConnection("Data Source=SERVER\SQLEXPRESS; Initial Catalog = xDB; Integrated Security = SSPI;")
使用此连接,在 Windows 窗体应用程序中,如果我连续执行 3 轮sqlCn.Open()
-- 查询数据库 -- sqlCn.Close()
,我会在第一轮得到很长的延迟(例如 2 秒)sqlCn.Open()
,并且在查询和打开时完全没有延迟/ 之后关闭。正是我对数据库连接池的期望。
但是,如果我对包含相同代码的 WCF 服务进行 3 次调用sqlCn.Open()
——查询数据库——sqlCn.Close()
代码,那么每次调用都会出现 2 秒的初始缓慢启动。
我的猜测是连接池完全由我的代码创建的 ADO.NET 对象控制,并且由于我正在实例化我SqlConnection
在 WCF 服务中使用的任何 ADO.NET 类(例如等),因此它们在我的服务调用时被破坏结束了,连接池也随之而来。
这可能不是真的,但如果不是,我所做的有什么问题吗?
有人有这方面的经验吗?
(请在发布前测试任何假设或理论)