我有一个Windows服务(C#),我创建多个线程,尝试更新我的数据库中的状态(SQL Server 2005)。
我最初有一个SELECT
,之后有一个UPDATE
必须执行。当我不使用锁来同步我的线程时,我收到错误
已经有一个与此Connection关联的开放DataReader 必须先关闭
但是当我使用lock(在静态对象上)时,更新速度非常慢。
任何人都可以帮助我解决这个问题。
答案 0 :(得分:5)
在尝试将其连接用于其他任何事情之前,请确保您的DataReader已关闭。我建议你重构你的代码,这样你就不会在线程之间共享连接。如果您可以提供有关您要实现的确切内容的更多信息,我可以提供有用的代码示例。
答案 1 :(得分:5)
您在应用程序中使用的每个命令对象都应该具有自己的连接对象,您可以在执行命令之前立即打开它,然后立即关闭。 (最好包含在using
声明中)
信任连接池技术以处理实际的底层连接。这将阻止多个线程同时尝试在同一连接上执行多个命令(这就是您所看到的错误所在。)
线程之间唯一应该共享的是连接 string 。
答案 2 :(得分:0)
当您在同一连接上同时打开多个DataReader时会发生这种情况,即您调用SqlCommand.ExecuteReader但在再次调用之前不要关闭此方法返回的SqlDataReader(无论是在同一命令上还是在同一命令上执行另一个命令)连接)。
也试试:
MultipleActiveResultSets=True
在连接链中。