关于多线程查询数据库的问题!

chaikunlai 2010-12-31 10:53:25
还是一个关于多线程查询数据库出现多个线程查出同一条记录的的问题。
表里本身有个字段,就是判断是否被查询过的。查询过的后的字段被改为false,就不再查询。
但是发觉还是一样,比如用了3线程,同一条记录还是被查处三次。
示例如下:
首先在form1类中
private static void createThread()
{
for (int b = 0; b < 3; b++)
{
Thread thread = new Thread(new ThreadStart(sendMessage));
thread.IsBackground = true;
thread.Name = b.ToString();
thread.Start();
}


private static void sendMessage()
{
GetData getdata = new GetData();
Record record = getdata.getNotSendMessage();
...
...
//这里面有数个需要查询不同表的数据,都是getdata这个类中的方法
Thread.Sleep(500);
sendMessage();


//GetData类中:
public Record getNotSendMessage()
{
string sql = "getNotSendMessage";
SqlDataReader reader = null;
try
{
DBHelper dbhelp = new DBHelper();
reader = dbhelp.ExecuteProcSelect(sql);
if (reader.Read())
{
Record record = new Record();
...
...
reader.Close();
return record;
}
reader.Close();
dbhelp.closeConnection();
return null;
}
catch (Exception e)
{
...
...
}
}

...
... //也是数个查询方法

//DBHelper 类中

public SqlConnection Connection
{
get
{
string connectionString ="数据库连接语句";

if (connection == null)
{
connection = new SqlConnection(connectionString);
connection.Open();
}
else if (connection.State == ConnectionState.Closed)
{
connection.Open();
}
else if (connection.State ==ConnectionState.Broken)
{
connection.Close();
connection.Open();
}
return connection;
}
}

public void closeConnection()
{
if (connection.State == ConnectionState.Open)
{
connection.Close();
}
else if (connection.State == System.Data.ConnectionState.Broken)
{
connection.Close();
}
}

public SqlDataReader ExecuteProcSelect(string procName, params SqlParameter[] values)
{

SqlCommand cmd = new SqlCommand();
cmd.Connection = Connection;
cmd.CommandText = procName;
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddRange(values);
SqlDataReader sdr = cmd.ExecuteReader();
return sdr;
}
...
...

现在主要的是sendMessage所有方法获取数据库中的数据如何让其不重复读取一条,
我试过用用lock都还是不行,在下很少用到线程..所请各位前辈帮帮忙!

...全文
290 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
chaikunlai 2011-01-06
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 ynw506 的回复:]

执行的sql加锁不行吗?
[/Quote]
因为SQL执行语句是在另一个类里面的,但是我加了锁之后没反应。跟没加锁一样。
RHCL 2011-01-06
  • 打赏
  • 举报
回复
执行的sql加锁不行吗?
chaikunlai 2011-01-06
  • 打赏
  • 举报
回复
就没有哪位前辈帮帮忙嘛??
只要在读取数据库的那时刻能让其锁住,其它时刻不锁....
  • 打赏
  • 举报
回复
LockMe myLockMe
Monitor.Enter(myLockMe);
//监控器锁定重要代码段

Monitor.Exit(myLockMe);
  • 打赏
  • 举报
回复
可以锁定,单线运行
chaikunlai 2010-12-31
  • 打赏
  • 举报
回复
LockMe myLockMe
Monitor.Enter(myLockMe);
//监控器锁定重要代码段

Monitor.Exit(myLockMe);
这个或者LOCK我都试过,必须把我的整个sendMessage()这个方法内容全部包含进去确实就是了。
但是这样其实就跟单线程什么区别了呀。
我想要的就是获取数据库的过程取出来不重复的,其它的照样运行,这样就可以先处理完提交给远程服务器的线程可以立即进行下一条..效率会高很多...因为取出数据库中的速度很快,但是提交给远程服务器的速度慢很多..
chaikunlai 2010-12-31
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 redmudwashcompanion 的回复:]

LockMe myLockMe
Monitor.Enter(myLockMe);
//监控器锁定重要代码段

Monitor.Exit(myLockMe);
[/Quote]
单线速度太慢,就是把需要的数据库从不同的表取出数据之后,用webservice提交到远程服务器,提交给远程服务器这个过程是比较慢的。
莫名其 2010-12-31
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 redmudwashcompanion 的回复:]
LockMe myLockMe
Monitor.Enter(myLockMe);
//监控器锁定重要代码段

Monitor.Exit(myLockMe);
[/Quote]

++
happyrain2010 2010-12-31
  • 打赏
  • 举报
回复
你可以先读取表记录到一个DataTable中
然后对这个DataTable采用多线程
spiderwolf2010 2010-12-31
  • 打赏
  • 举报
回复
用Lock 或者DB锁

110,537

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧