听说这个板块维护的不错,特来请教一个棘手的问题》》

jiujiuchong 2003-10-15 12:50:33
我现在要做一个工程,其中有一个模块需求大致如下:
有一个TCP套接字在不停的收取线上发过来得数据,(峰值可能达到每秒钟60~100笔数据)而我每收到一笔数据就会首先做一些判断,比较之类的工作,然后有可能对中心数据库的12张左右的表进行update或insert。这是服务器软件,是7*24小时工作的,并且不能丢数据。
我的问题:
1。只在一个线程中,对数据库IO大概耗时多少,能不能快到我顺利的接受下一笔数据?
2。如果要丢数据,那么如果每笔数据开一个work线程,势必要用线程池的技术。vc好像这块较麻烦?
3。请各位指教,随便发表意见,对不对没关系。
...全文
58 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
tszsj 2003-11-09
  • 打赏
  • 举报
回复
MFC的Sock的例子程序看一下,基本回答了问题。
crystal_heart 2003-11-09
  • 打赏
  • 举报
回复
up
rockrabbit 2003-11-06
  • 打赏
  • 举报
回复
数据量大的情况下用FTP。
victorzou 2003-11-05
  • 打赏
  • 举报
回复
我也做类似程序,从局域网socket收数据,处理后反馈处理结果,存入数据库,并发送到串口(短信),实时。
我打算用多线程,守,发,存各一个线程。
sevencat 2003-11-05
  • 打赏
  • 举报
回复
我觉得专门搞个线程来专门写数据
这个线程里面维护一张要做的事情的列表。
std::list<const char *sql> requestlist;
每次要操作数据库的时候将写的请求直接加到列表里面。
而这个线程所做的事情也就是不停的看看列表是否为空。

不过假如每次操作都要看看操作有没有成功,那这种方法估计就是不可能了。
这样只要维护一个数据库连接。

不过假如读的时候要即时读可能麻烦了一点。我觉得只有多开几个连接,然后等待你的工作线程来进行查询(先将连接开好了,然后放到线程池里面去,当需要的时候再进行读)


wj_xiazi 2003-11-05
  • 打赏
  • 举报
回复
我决定可以设置两个工作线程,一个用来写数据库,一个用来读数据库。
此外,
1 用SQL语句和存储过程进行数据更新
2 正确选择游标的位置、类型和锁方式
如果只需要按顺序读取记录并且不需要滚动和更新记录,最好使用服务器端游标(adUseServer)、仅向前游标(adOpenForwardOnly)和读加锁(adLockReadOnly),这样可以获得最好的性能。如果需要滚动记录,采用客户端游标(adUseServer)会比采用服务器端游标所得到的性能要好,因为ADO系统默认是采用服务器端游标类型。当然如果数据集合相当大,采用服务器端游标的性能会好一些。同时需要注意:如果采用客户端游标,最好只采用读加锁(adLockReadOnly)的锁类型,因为如果需要更新数据,客户端游标引擎需要得到额外的信息(元数据),而获取这个信息的代价是非常昂贵的。

3.调整记录集对象的CacheSize属性

ADO使用记录集对象的CacheSize属性来决定提取和缓存的记录的数目,当在缓存的范围内浏览数据时,ADO就只从缓存中提取数据。当要浏览的数据超出缓存范围的时候,ADO就释放当前缓存,提取下一些记录(提取的数目为CacheSize所指定的大小),所以必须根据具体的应用程序的情况,来设定CacheSize的大小,保证得到最佳的性能。

4 批量更新数据
yh824 2003-11-04
  • 打赏
  • 举报
回复
我们公司不准用qq,但是可以用Msn.
yh824@msn.com
hungta 2003-11-04
  • 打赏
  • 举报
回复
我做的项目和你很相似,是在线收图象和数据之后存储。有时间(工作时间)我们在雅虎通我的ID:SONG_PEIHUA或QQ(20253729)上讨论啊
jiujiuchong 2003-10-15
  • 打赏
  • 举报
回复
你就是说用线程池处理了。
孤必有邻 2003-10-15
  • 打赏
  • 举报
回复
一点建议:
1、建立请求队列
2、采用有限数目多线程处理请求队列(接收、处理数据)
3、采用支持缓冲存储的数据库,按操作不同,用不同线程处理(尽量做到一个表打开一次)
quanch 2003-10-15
  • 打赏
  • 举报
回复
我觉得缓冲池是肯定要的,可以根据每笔数据需要写的数据库表的不同用不同的线程,同一数据库表就没有必要用多个线程了。这样就能有效避免死锁,而且瓶颈往往是在数据库服务器的操作,一个线程给数据库服务器发送数据足够了。想要实时的前提是数据库的最大处理能力和平均收到的待处理数据相当,否则肯定无法实现实时,只能想其他的办法实现半实时吧!
yh824 2003-10-15
  • 打赏
  • 举报
回复
不是,对单比数据只有一次数据库IO,数据是TCP/IP套接字上的
阿甘 2003-10-15
  • 打赏
  • 举报
回复
对单笔数据来说,需要先读数据库后比较再写数据库?
yh824 2003-10-15
  • 打赏
  • 举报
回复
每笔数据量不大
yh824 2003-10-15
  • 打赏
  • 举报
回复
对了,再说明一下:
1。在很短的时间内每笔数据更新数据库的表是不大可能相同的。
2。用单线程缓冲区的话,以为数据不停堆积,最后缓冲区再大还是会被冲破的。
mfc168 2003-10-15
  • 打赏
  • 举报
回复
我以前做过这些数据维护的程序,你所说的情况根本不能实现,要考虑的东西太多,比如:线路、安全性、IO、同步等等
我们实现方法:采用定时分段维护,而且采用中间文件传输,将文件传到文件服务器,避免与数据库服务器直接打交道,因为数据库服务器工作量很大
这样做有好处是安全性好,不存在丢失数据情况,唯一缺点就是不是实时的
阿甘 2003-10-15
  • 打赏
  • 举报
回复
另外,这里的一笔数据是多大的量呢?
阿甘 2003-10-15
  • 打赏
  • 举报
回复
不用多线程很难处理过来,缓冲区看来也少不了。。。
丁淇石头 2003-10-15
  • 打赏
  • 举报
回复
刚要建议spwnihao(面鱼)置顶,却发现已经在上边了。好!
丁淇石头 2003-10-15
  • 打赏
  • 举报
回复
如果使用多线程,比较容易造成死锁的。
加载更多回复(9)

4,011

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 数据库
社区管理员
  • 数据库
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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