我正在使用Parallel.For进行并发调用。
SqlConnection connection = new SqlConnection(connectionString);
connection.Open();
SqlCommand cmd = new SqlCommand();
//SqlDataReader reader;
cmd.CommandType = CommandType.Text;
cmd.Connection = connection;
Parallel.For(0, 100, delegate(int i)
{
//insert into database;
cmd.CommandText = string.Format("insert into Service_LoadTest(id,ServiceCallcount) values ({0},'Call_{1}')", i, i);
cmd.ExecuteNonQuery();
});
在插入一些计数到70之后,我收到超时异常,因为“超时已到期。超时时间已经过去,操作完成或服务器没有响应。”。我已经设置了连接字符串超时属性,但是没运气。请帮忙。
答案 0 :(得分:2)
您的代码不是线程安全的。尝试将所有代码移动到循环中:
Parallel.For(0, 100, delegate(int i)
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
SqlCommand cmd = new SqlCommand();
cmd.CommandType = CommandType.Text;
cmd.Connection = connection;
cmd.CommandText = string.Format("insert into Service_LoadTest(id,ServiceCallcount) values ({0},'Call_{1}')", i, i);
cmd.ExecuteNonQuery();
}
});
答案 1 :(得分:0)
不是每次都创建SqlConnection和SqlCommand对象,而是为每个查询单独调用ExecuteNonQuery,你应该连接所有查询,并且只为该连接查询调用一次ExecuteNonQuery。
为了实现上述功能,只需在CommandText中附加由';'分隔的所有查询。然后调用ExecuteNonQuery。