【问题标题】:Stateless WCF service and database connection pooling无状态 WCF 服务和数据库连接池
【发布时间】:2012-07-02 19:04:39
【问题描述】:

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

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

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

Can a Stateless WCF service ...

较早的答案基本上表明与任何其他 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 秒) 987654325@,查询完全没有延迟,之后打开/关闭。正是我对数据库连接池的期望。

但是,如果我对包含相同 sqlCn.Open() 的 WCF 服务进行 3 次调用——查询数据库——sqlCn.Close() 代码,每次调用都会出现 2 秒的初始缓慢启动。

我的猜测是连接池完全由我的代码创建的 ADO.NET 对象控制,并且由于我在 WCF 服务中实例化我使用的任何 ADO.NET 类(例如SqlConnection 等),它们当我的服务调用结束并且连接池随之结束时被销毁。

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

有人有这方面的经验吗?

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

【问题讨论】:

  • 您确定您的连接正在关闭,即使发生异常,例如使用 try { ... } finally { connection.Close(); } 还是使用 using 语句?
  • 是的,它们正在被明确关闭。
  • 为了将来参考,问题不在于您是否在进行明确的SqlConnection.Close() 呼叫。问题是该调用是否会总是进行。它应该在try { … } finally { … } 构造的finally 块中,或者整个连接生命周期应该在using 块中:using (SqlConnection conn = new SqlConnection(…)){ // use the connection }

标签: c# wcf


【解决方案1】:

1) 这是文档:

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

第一次打开连接时,会创建一个连接池 关于将池与 连接中的连接字符串。每个连接池是 与不同的连接字符串相关联。当一个新的连接 打开,如果连接字符串与现有的不完全匹配 池,创建一个新池。连接是按进程池化的,每个 应用程序域、每个连接字符串以及何时集成安全性 根据 Windows 标识使用。连接字符串也必须是 完全符合;以不同顺序为相同关键字提供的关键字 连接将被单独池化。

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

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

4) 最后:

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

【讨论】:

  • 我知道这个文档。但是在我系统中的物理宇宙中,它不服从文档的命令。无论出于何种原因,都需要显式设置“Pooling = true”来解决它。
【解决方案2】:

我自己解决了。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-09
    • 2016-12-28
    • 1970-01-01
    相关资源
    最近更新 更多