2010-08-13 46 views
0

在WCF之前的.NET(C#)Web服务中,我拥有一个昂贵的IDisposable资源,我持有一个静态(实际上是ThreadStatic)引用。 (它在内部持有一个SqlConnection。)我应该如何确保在应用程序池刷新时处理这个问题,我是否应该简单地禁止FxCop警告而不担心它,还是有第三种选择?在Web服务中处理静态资源

最初服务通过使用块打开每个请求上的连接,但该设计由于“连接资源问题”而被拒绝。

回答

1

由于连接资源问题,此设计将被拒绝。如果你以前遇到过问题,你将再次拥有它们,因为现在你将使用更多的SqlServer连接(如果它是线程静态的,那么每个线程将有一个SqlServer,更重要的是,一个底层的真实连接,即使它没有使用连接并且将返回到池的底层连接)。

+0

非常好的一点。我没有选择新的设计。你会建议什么? – TrueWill 2010-08-13 17:38:01

+1

您需要重新检查连接资源问题,并查看实际问题。通常情况下,最好的模式是打开连接,执行操作,然后关闭它,或者通过连接上的使用块,或者 - 如果您要返回数据读取器以便可以高效地迭代,则使用中的数据读取器使用CloseConnection选项创建的块,因此它是处理触发器的连接处置。这样,“真正的”连接即时返回到池。你的改变让事情变得更糟,因为永远不会退回。通常模式出错了...... – 2010-08-15 14:06:50

+0

......创建数据读取器的连接(因此不在使用中)并将数据读取器放入使用状态之间发生错误了吗?这种情况可能会导致泄漏(我使用一个包装类来处理连接,但是当它成功创建一个包含闭合选项的数据读取器时,将“停止拥有”连接,因为它现在是读者关闭它错误的另一个来源是,如果你在interator块的datareader上使用''using',无论是作为错误还是有意的,都不会进入使用块,因为第一个... – 2010-08-15 14:10:09