2

之前在 StackOverflow 中已经提出过这个问题,但根据我的经验,答案实际上是错误的。至少对于 .NET Framework 4.0 和 SQL Server 2005,它们是错误的。

我需要帮助才能一劳永逸地解决这个问题。

问题是 - 无状态 WCF 服务可以以某种方式使用数据库连接池吗?

请参阅无状态 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 类(例如等),因此它们在我的服务调用时被破坏结束了,连接池也随之而来。

这可能不是真的,但如果不是,我所做的有什么问题吗?

有人有这方面的经验吗?

(请在发布前测试任何假设或理论)

4

2 回答 2

0

我设法自己解决了。

我必须在我的连接字符串中明确声明“Pooling = true”(并添加一个非零的“Min Pool Size”)。然后它一直在工作。如果没有设置,它有时实际上会按预期工作,但大多数情况下不会。

我还使用不同的用户帐户对其进行了测试(使用用户名/密码的 SQL Server 身份验证与“集成安全性 = SSPI”)。只要您设置“Pooling = true”,这两种方法都适用于 WCF 服务。

如果这只是我的安装/SQL Server 版本/ADO.NET 版本的问题,则没有数据,但确实需要很长时间才能解决。

于 2012-07-03T16:06:27.160 回答
0

1)这是文档:

http://msdn.microsoft.com/en-us/library/8xx3tyca.aspx

首次打开连接时,会根据精确匹配算法创建连接池,该算法将池与连接中的连接字符串相关联。每个连接池都与一个不同的连接字符串相关联。打开新连接时,如果连接字符串与现有池不完全匹配,则会创建一个新池。每个进程、每个应用程序域、每个连接字符串以及在使用集成安全性时,每个 Windows 身份都将连接池化。连接字符串也必须完全匹配;以不同顺序为同一连接提供的关键字将分别汇集。

2) 对于同一个链接,“默认情况下,ADO.NET 中启用了连接池。”

3) 这与所讨论的 WCF 调用是否是无状态的完全无关。

4)最后:

我们强烈建议您在使用完连接后始终关闭连接,以便将连接返回到池中。您可以使用 Connection 对象的 Close 或 Dispose 方法,或者通过在 C# 中的 using 语句或 Visual Basic 中的 Using 语句中打开所有连接来执行此操作。未明确关闭的连接可能不会添加或返回到池中。

于 2012-07-02T19:13:17.217 回答