我目前正在创建一个WCF Web服务。SqlConnection/SqlCommand线程安全吗?
作为其工作的一部分,它不幸需要做一些相当密集的计算,但是这些计算可能会在调用web服务之间共享。实际上 - 我们只需要进行一次计算,所有后来的调用都可以获得好处。
但是,由于WCF没有共享应用程序状态,因此将WCF设置为单实例模式似乎是合理的。 (每个客户端需要某些计算在所有的情形产生,迫使我们重新计算他们每serssion这可能是好的,或者每个调用,它是站不住脚的)
不过,我不是很熟悉的固定码为多个线程。 我一直在读它,并且因为我们的WCF代码都没有写入共享状态(除了易于保护的计算位),我几乎相信我不需要改变任何东西。
虽然存在一个问题 - 我们使用SqlConnection和SqlCommand与我们的后端进行通信,我不确定是否可以指望这些线程安全?
编辑:我应该澄清一下,命令/连接总是本地的方法。我们在静脉说话的模式:
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在多线程场景中工作?
如果没有,是否有线程安全的替代方案?
是的,我可以只锁定在我的web服务所有的数据库访问方法,但一)它的丑陋和b)如果它没有必要我宁愿我没得:)
干杯提前!
如果您不跨线程共享同一实例,并且类的静态部分是线程安全的,那么您没有问题 –
不要在线程之间共享这些实例,打开它们,运行查询并处理尽快地。连接池将处理连接优化。 – TheCodeKing