我正在创建一个WCF Web服务。作为其任务的一部分,它将不幸需要执行一些相当复杂的计算,但这些计算可以在调用WebService之间共享。实际上,我们只需要做一次计算,以后的所有调用都可以受益。
然而,由于WCF没有共享应用程序状态,所以将WCF设置为单实例模式似乎是合理的。(每个客户端都可能需要所有计算,迫使我们针对每个会话重新计算,这可能是可行的,或者每个调用都要重新计算,这是无法接受的)
然而,我对多线程代码的安全性并不很熟悉。我已经阅读了一些相关资料,因为我们的WCF代码没有写入共享状态(除了计算位,这很容易保护),我几乎相信我不需要改变任何东西。
然而,有一个问题 - 我们使用SqlConnection和SqlCommand与我们的后端进行通信,我不确定这些是否是线程安全的?
编辑:我应该明确的是,Commands / Connections始终局限于方法中。我们在谈论以下模式:
然而,由于WCF没有共享应用程序状态,所以将WCF设置为单实例模式似乎是合理的。(每个客户端都可能需要所有计算,迫使我们针对每个会话重新计算,这可能是可行的,或者每个调用都要重新计算,这是无法接受的)
然而,我对多线程代码的安全性并不很熟悉。我已经阅读了一些相关资料,因为我们的WCF代码没有写入共享状态(除了计算位,这很容易保护),我几乎相信我不需要改变任何东西。
然而,有一个问题 - 我们使用SqlConnection和SqlCommand与我们的后端进行通信,我不确定这些是否是线程安全的?
编辑:我应该明确的是,Commands / Connections始终局限于方法中。我们在谈论以下模式:
using sqlConn = new SqlConnection(...) {
try {
sqlConn.Open()
} catch () {
throw new FaultException();
}
var cmd = new SqlCommand("Some SQL", sqlConn);
var reader = cmd.ExecuteReader();
//Read the stuff
reader.Close();
//Return something
}
我在MSDN上查询了SqlCommand类:http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.aspx,其中写道:“任何此类型的公共静态成员(Visual Basic中为Shared)都是线程安全的。任何实例成员都不能保证是线程安全的。”
我的理解是,MS没有保证SqlCommand能在多线程场景下正常工作,您是否也这样认为?
如果不支持,是否有线程安全的替代方案?
是的,我可以在WebService中锁定所有数据库访问方法,但这很麻烦,而且如果不必要,我宁愿不这样做 :)
提前感谢您的回复!
END EDIT