Faf*_*fnr 5 c# multithreading locking sqlcommand thread-safety
我目前正在创建一个WCF Web服务.
作为其工作的一部分,遗憾的是需要进行一些相当密集的计算,但幸运的是,这些计算可以在对Web服务的调用之间共享.实际上 - 我们只需要进行一次计算,所有以后的调用都可以获得好处.
但是,由于WCF没有共享应用程序状态,因此在单实例模式下设置WCF似乎是合乎逻辑的.(每个客户端都需要进行一些计算,迫使我们重新计算它们,这可能是正常的,或者每次调用都是站不住脚的,这是不可能的)
但是,我不太熟悉保护多线程的代码.我一直在阅读它,因为我们的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
}
Run Code Online (Sandbox Code Playgroud)
结束编辑
我在MSDN上查找了SqlCommand类:http: //msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.aspx 其中说:"任何公共静态(在Visual Basic中共享)成员类型是线程安全的.任何实例成员都不保证是线程安全的."
我是否正确地解释了这一点,这意味着MS 不能保证SqlCommand在多线程场景中工作?
如果没有,是否有线程安全的替代方案?
是的,我可以在我的webservice中锁定所有数据库访问方法,但是a)它很丑陋b)如果没有必要我更喜欢我没有必要:)
提前干杯!
我是否正确地解释了这一点,这意味着MS不能保证SqlCommand在多线程场景中工作?
只要您正确使用它,它在多线程场景中工作正常.
如果多个线程尝试使用SAME SqlCommand,您认为会发生什么?怎么可能有用呢?
但是如果使用不同连接的不同线程向同一个数据库发出不同的命令,则没有问题.
有关MSDN线程安全的音符,真正打破,严重的措辞,而且必须由人谁不知道线程安全什么写的.
他们试图用该消息(在MSDN上记录的99.9%的类和函数上加上)说:"这种类型的任何静态方法都可以由多个线程同时安全地调用.同一个实例成员在同一个如果多个线程同时调用instance,则不保证instance是安全的,但访问不同对象上的同一个成员是完全没问题的."