首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无状态WCF服务和数据库连接池

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

Stack Overflow用户
提问于 2012-07-03 03:04:39
回答 2查看 5.7K关注 0票数 2

这个问题以前在StackOverflow中被问过,但根据我的经验,答案实际上是错误的。至少对于.NET Framework4.0和SQL Server2005来说,它们是错误的。

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

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

请参阅Can a Stateless WCF service ...

前面的答案基本上说明了没有问题,与任何其他ADO.NET场景也没有区别。然而,我还没有能够获得一个无状态的WCF服务来使用连接池,而我可以看到它总是在WCF服务之外工作。无论我尝试使用什么连接字符串或参数,它都不会执行此操作。

默认情况下,数据库连接池是启用的,因此一个简单的连接字符串就可以将我带到那里,例如在SQL Server Express上:

代码语言:javascript
复制
SqlConnection sqlCn = new SqlConnection("Data Source=SERVER\SQLEXPRESS; Initial Catalog = xDB; Integrated Security = SSPI;")

使用这个连接,在Windows Form应用程序中,如果我连续执行3轮sqlCn.Open() --查询数据库-- sqlCn.Close(),我会在第一个sqlCn.Open()上得到很长的延迟(例如2秒),并且在查询和随后的打开/关闭时没有任何延迟。这正是我对数据库连接池的期望。

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

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

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

有谁有这方面的经验吗?

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

EN

回答 2

Stack Overflow用户

发布于 2012-07-03 03:13:17

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语句中的所有连接。未显式关闭的连接可能不会添加或返回到池中。

票数 0
EN

Stack Overflow用户

发布于 2012-07-04 00:06:27

我设法自己解决了它。

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

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11299666

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档