【发布时间】: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 }