如何使用多线程技术来读取数据库记录并利用读取的记录数据进行其他数据处理?(内有说明)
比如,数据库表 sheeta 中有n条记录(n未知),
现在,我需要读取sheeta中的记录,采用10个线程并发执行,每个线程取一条记录,线程存活时间为60分钟,每个记录的线程执行结束后,则继续从sheeta 中读取一条记录,直到所有记录全部遍历,或者有外来终止指令来终止线程执行。
恳请各位大侠指点,最好能给出程序示例,谢谢:)
问题点数:200、回复次数:24Top
1 楼BQY(半小时)回复于 2006-03-20 16:44:32 得分 40
我觉得主要防止一个线程读了记录A后,另一个线程还会去读A...可以利用lock或Mutex类防止此类事情发生,其他应该和单线程读取一致了吧...Top
2 楼jetxia(Thinking->Asking&Studying->Doing)回复于 2006-03-20 16:49:26 得分 10
好多的分哦
那么 线程和记录之间的 有什么关系吗?比如某线程在读取上条记录和下条记录之间有什么条件?我对你的问题还是不太清楚Top
3 楼canserly(没啥不好意思)回复于 2006-03-20 16:50:12 得分 0
lock或Mutex针对的好象都是表吧,楼上的话...
Top
4 楼ubc(提着种子找麦田)回复于 2006-03-20 16:53:12 得分 0
按楼上提示:
是不是可以这样,在sheeta中加个标记字段flag,
flag=1 则,表示线程已经读取
flag=0 表示未读取
flag=2 表示已经执行结束
按照flag来读取新的记录。
有更好的方法吗?我初学c#,最好能有个代码例子
我想采用 threadpool方法,但是对线程操作还很不熟,这个是我第一次接触。。
Top
5 楼BQY(半小时)回复于 2006-03-20 17:02:02 得分 0
楼主可不可以将问题说的更详细一些阿? 举个例子说明你要达到的目的和实现结果.反正我现在是猜着需求给你求解.Top
6 楼BQY(半小时)回复于 2006-03-20 17:07:57 得分 20
Table:
ID Name
Code:
int currentID=0;
private void MyThreadInfo()
{
string sql="";
lock(this)
{
//读取一条记录,并将当前ID后延
sql="select * From Table Where ID=" + currentID++;
}
}
Top
7 楼ubc(提着种子找麦田)回复于 2006-03-20 17:13:43 得分 0
留言给我QQ或MSN。Top
8 楼hy98521(斯达克)回复于 2006-03-20 17:22:35 得分 10
lock(this)
{
outitem.MsgState =(int)MSG_STATE.SENDING;
this.delFromOutQueue(seq);
this.addToWaitingQueue(outitem);
}Top
9 楼MonkWang(象写情书一样写程序)回复于 2006-03-20 17:28:06 得分 0
狂学习!Top
10 楼ubc(提着种子找麦田)回复于 2006-03-20 17:30:44 得分 0
楼上的能再具体些吗?Top
11 楼ubc(提着种子找麦田)回复于 2006-03-20 17:59:24 得分 0
下之前再顶下!Top
12 楼Samen168(Code to coding)回复于 2006-03-20 18:08:05 得分 20
如果加线程锁和单线程就没什么区别了,不过像楼主的一次只读取一条记录性能会更差
可以参考数据库分页算法(网上很多这方面的资料),以某种规律用不同的线程读取不同页Top
13 楼xrwang(无涯)回复于 2006-03-20 21:34:11 得分 50
我觉得这样可能还要简单些(仿网络蚂蚁的):
1.人为给记录加一个"序号"字段;
2.根据记录总数和线程数来计算每个线程负责的记录范围;
3.每个线程只处理所属的那一部分记录.Top
14 楼ubc(提着种子找麦田)回复于 2006-03-21 10:33:55 得分 0
xrwang(无涯):
是简单了,但是,每个记录的数据处理所需要的时间不一样,而且是未知的,这样会导致无法进行合理的分组,多线程也就没有使用的意义了Top
15 楼xrwang(无涯)回复于 2006-03-21 11:32:28 得分 0
先处理完的线程可以向未处理完的线程申请未处理的部分呀,
然后重新得到每个线程需要处理的记录范围,
再继续处理。Top
16 楼xrwang(无涯)回复于 2006-03-21 11:37:44 得分 0
不过如果是讲究公平的我,我不会去重新分配线程处理的记录范围。
该线程A做的事情决不能让B去搞。Top
17 楼lostowner()回复于 2006-03-21 12:03:23 得分 0
占位
Top
18 楼520zyb(欲穷千里目,更上一层楼)回复于 2006-03-21 12:15:14 得分 20
楼上有个方法:加个标记字段flag 可以实现
或是:
为每条记录加个序号,每个读取记录时在一个全局变量中记录该序号,修改其值时先lock(),下次取的时候都从比这个序号大的一个开始Top
19 楼diandian82(点点(nothing))回复于 2006-03-21 12:22:17 得分 10
用lock就可以搞定,线程自己会suspendTop
20 楼ubc(提着种子找麦田)回复于 2006-03-21 17:48:51 得分 0
ManualResetEvent stop = (ManualResetEvent)stopEvent;
while(!stop.WaitOne(0,false)))
{
}
WaitOne(0,false) 究竟是什么意思?Top
21 楼Knight94(愚翁)回复于 2006-03-21 19:08:41 得分 0
虽说能按照你的要求能写出来,但是不知道这样写有什么具体的意义。
:(Top
22 楼Knight94(愚翁)回复于 2006-03-21 19:14:21 得分 20
因为你要放防止某个线程取出来的数据不要被别的线程取出来,如果要完成这个功能,你就需要在前端来获得需要更新的记录集,例如每次10个,然后每个子线程在单独读记录集里固定的记录行,进行处理。
要说每个处理线程单独开一个connection,我觉得也不太可能,而每个线程一次只处理一条或几条,总觉得效率没提高多少。
Top
23 楼hdj_05(过河卒)回复于 2006-03-27 15:08:05 得分 0
学习!!我也在学习多线程的问题,就是不会!!呵呵Top
24 楼ubc(提着种子找麦田)回复于 2006-03-30 08:58:23 得分 0
这几天有其他事情,事情忙完了,继续搞:)
Knight94(愚翁)
你的方法可能比较适合。
Top
相关问题
- 数据库中某数据处理问题,急! 谢谢
- 一个关于数据库数据处理的问题!!!!急...急...急...
- javabean封装了数据处理后,数据库里是乱码!在线急等!
- 请教一个关于数据库海量数据处理的问题.
- 讨论一下电子商务大型数据处理用何种数据库?来者有分
- 数据库读取
- 请教完整点的读数据库,写数据库时对数据处理的步骤.(单引,双引,HTML tags)
- 请问在web开发中,www服务器,数据库,数据处理,ie客户端...等几方面是如何组织在一起的
- 请问在web开发中,www服务器,数据库,数据处理,ie客户端...等几方面是如何组织在一起的,
- 如果对大量的数据库数据处理,那么用大量的select好呢;还是用select出所有的,再用变量进行处理好?




