Foxtable(狐表)用户栏目专家坐堂 → [求助]多线程统计分店销量


  共有3693人关注过本帖树形打印复制链接

主题:[求助]多线程统计分店销量

帅哥哟,离线,有人找我吗?
chnfo
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2240 积分:18457 威望:0 精华:0 注册:2011/11/26 20:21:00
[求助]多线程统计分店销量  发帖心情 Post By:2021/3/16 13:38:00 [只看该作者]

只是借用这个场景来寻求解决方法。 服务端想每周统计一次各分店所有商品的销量,把数据存到中间表(实体表)中,方便其他查询调用。当然,遍历分店,各自统计是可以的。 上面这种场景如何用多线程,比如一个分店开启一个线程来计算

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:110648 积分:563148 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2021/3/16 14:02:00 [只看该作者]

遍历分店,各自统计是可以的 -- 把这个统计的逻辑放到线程里处理即可

 回到顶部
帅哥哟,离线,有人找我吗?
chnfo
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2240 积分:18457 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2021/3/16 20:07:00 [只看该作者]

是用异步函数么?那一部分帮助没看明白.
其实统计分店的销量SQL很简单啊
SEL  ECT 销量表.分店号, Sum(销量表.数量) AS 销量合计
FROM 销量表 where 销售月份 = 202103
GROUP BY 销量表.分店号

怎么为每个项目单独开线程?


[此贴子已经被作者于2021/3/16 20:23:18编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:110648 积分:563148 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2021/3/16 20:41:00 [只看该作者]

什么地方没看明白,请提出具体的问题。

既然简单就直接统计呗。别人又不懂您的业务,还以为计算多复杂,要几十套逻辑才能计算完成呢

 回到顶部
帅哥哟,离线,有人找我吗?
chnfo
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2240 积分:18457 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2021/3/16 21:05:00 [只看该作者]

1、定义一个分店的统计函数TJ
dim FDName as string = args(0)
dim CMon as integer = asrgs(1)
Dim cmd As New SQLCommand
cmd.C onnection Name = "数据源名称"

cmd.CommandText = "SEL  ECT 销量表.分店号, 销量表.销售月份, Sum(销量表.数量) AS 销量合计 " & _
" FROM {销量表} where  分店名称 = '" & FDName & "' and 销售月份 = " & CMon " & _
" GROUP BY 销量表.分店号 ,销量表.销售月份 " 
Dim dt As DataTable  = cmd.ExecuteReader()

cmd.CommandText = "SEL  ECT  * from {目标中间表} where [_Identify] is null" 
dim XX as datable = cmd.ExecuteReader(true)

dim f As New Filler
f
.SourceTable = dt
f.DataTable = XX
f.Fill()
'填充数据


xx.save



2、 统计分店(N个分店)的销量
dim CM as integer = 202103
for each dr as datarow in datatables("分店名册").datarows
    Functions.AsyncExecute("TJ",dr("分店名称"),CM)   
 ‘如果一个个分店按顺序计算就是 functions.Execute("TJ",dr("分店名称"),CM),但考虑到分店多、数据量大的时候,可能效率比较低,所以才想着开多个线程去计算
next

是这么个用法?

只是借用这个例子来整个方法,实际的业务比这个复杂一些,每个月、每个店要统计的数据明细可能会达到百万行,然后统计的结果会在5万行左右
[此贴子已经被作者于2021/3/16 21:12:30编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:110648 积分:563148 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2021/3/16 21:39:00 [只看该作者]

就是这样用法呀。

如果只是为了填充统计数据,直接一条SQL即可

insert into 目标中间表(分店号, 销售月份,销量合计SELECT 销量表.分店号, 销量表.销售月份, Sum(销量表.数量) FROM {销量表} where 销售月份 = " & CMon & " GROUP BY 销量表.分店号 ,销量表.销售月份 

只需传入月份即可一次性统计所有分店数据

 回到顶部
帅哥哟,离线,有人找我吗?
chnfo
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2240 积分:18457 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2021/3/17 16:09:00 [只看该作者]

追问:话说上面的用法,不能用access做数据库?网帖称access不支持多线程,可能会死锁。另外,如果服务端在更新中间表时,客户端多用户可能访问这个中间表怎么办?
[此贴子已经被作者于2021/3/17 16:15:39编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:110648 积分:563148 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2021/3/17 16:20:00 [只看该作者]

access的并发访问数很少,线程多会死锁。

有2种情况,1、其它用户会等待更新完毕才能访问;2、可以访问,访问到更新前的数据。

通常这种耗时的统计计算,都会放到半夜执行,避免出现访问异常

 回到顶部
帅哥哟,离线,有人找我吗?
chnfo
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2240 积分:18457 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2021/3/17 20:21:00 [只看该作者]

如果服务端停止客户端访问数据库,只在服务端执行上面的代码,会不会导致如死锁之类的问题?

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  10楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:110648 积分:563148 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2021/3/18 8:40:00 [只看该作者]

一个线程可以理解为一个客户端,线程多会死锁。

 回到顶部