无状态WCF服务和数据库连接池

时间:2012-07-02 19:04:39

标签: c# wcf

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

我需要帮助才能彻底解决这个问题。

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

请参阅Can a Stateless WCF service ...

早期的答案基本上表明,没有问题,也没有任何其他ADO.NET方案的差异。但是,我无法使用无状态WCF服务来使用连接池EVER,而我可以看到它始终在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()上,在查询和后续打开/关闭时根本没有延迟。正是我对数据库连接池的期望。

但是,如果我对包含相同sqlCn.Open()的WCF服务进行3次调用 - 查询数据库 - sqlCn.Close()代码,我将为每次调用获得2秒的初始慢启动。 / p>

我的猜测是连接池完全由我的代码创建的ADO.NET对象控制,因为我在我的WCF服务中实例化我使用的任何ADO.NET类(例如SqlConnection等) ,当我的服务调用结束时,它们会被破坏,连接池也会被破坏。

这可能不是真的,但如果不是,我所做的事情有什么不妥吗?

任何人都有这方面的经验吗?

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

2 个答案:

答案 0 :(得分:0)

1)以下是文档:

  

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

     

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

2)根据相同的链接,"默认情况下,在ADO.NET中启用连接池。"

3)这完全与所讨论的WCF呼叫是否为无状态无关。

4)最后:

  

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

答案 1 :(得分:0)

我设法自己解决了。

我必须明确说明“Pooling = true”(并在我的连接字符串中添加一个非零“Min Pool Size”)。然后它一直在努力。如果没有设置,它有时会按预期工作,但大部分都没有。

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

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