首页 新闻 会员 周边 捐助

服务端多线程数据库备份程序不执行了,怀疑是sleep,困扰很久了,200分求解决

1
悬赏园豆:200 [已解决问题] 解决于 2012-06-26 18:07

现在做一个程序,windows服务,工作任务就是从mongodb数据库中读取数据,然后处理下保存到其它服务端数据库上。

像日志这样的大数据库都是游标处理,处理完了等几分钟再从最后取到的地方再取,其它的就是凌晨的时候备份,这些线程我都是采用的sleep的方式来控制暂停的。

由于特定的任务多,所以线程比较多。比如有些线程会休眠sleep 几个小时。

但是程序在服务器上运行几天以后就会出现数据库不进数据了,但是windows服务上程序是正常的,没有挂或者停止,日志也不写了。

 

一直没找到问题,怀疑是sleep睡了可能没醒,我这里也没有设置线程优先等级,有经验的大虾给个问题可能的出现原因和解决方案

海不是蓝的主页 海不是蓝 | 初学一级 | 园豆:2
提问于:2012-06-26 14:17
< >
分享
最佳答案
0

“有些线程会休眠sleep几个小时”,为什么不用任务调度方式,比如用Quartz.NET

如果你还是坚持用sleep的方式,能不能贴出sleep与wakeup的主要代码?

收获园豆:150
dudu | 高人七级 |园豆:30778 | 2012-06-26 14:26

不好意思,工作的电脑是另外一台,不能外网的,是游戏数据库,区服比较多,每个区服又有几个线程任务,假如单个游戏区服1区,线程1是备份log的,线程内方法采用的是while(true)的方式来死循环,当前Log读取完了,就sleep()了几分钟,然后有开始读取新的日志数据,线程2是凌晨备份一些排行数据和角色数据,都是while(true)加sleep方式,,由于线程2的任务只需要凌晨启动一次,所以线程2我是每分钟检查一次当前的时间,如果不是凌晨就是sleep 1分钟,还有个线程3是单独的线程,不会因为添加了游戏区服而添加,是定期gc回收内存。

 

dudu这里说的wakeup我这里貌似就是等sleep时间到了线程就自己醒了,并没有用什么特色的方式去唤醒线程。之前做过一些程序这样没问题,所以习惯了就直接sleep了,自己认为反正sleep到了它自己会醒了,但是现在程序跑个几天就睡着了,数据库数据也不来了,而且程序在windows服务上面状态是启动的,线程也不写日志了

dudu这里介绍的任务调度我去查查看,这个程序假如承受10个区服数据,那么可能就有20-30个线程在备份数据,很多线程都会sleep的,所有区服数据库的数据量上亿级的。

海不是蓝 | 园豆:2 (初学一级) | 2012-06-26 14:43

@海不是蓝: 检查过Windows事件日志了吗?

dudu | 园豆:30778 (高人七级) | 2012-06-26 14:56

@dudu: 运维说没有日志,程序是正常的,状态是启动,没有停止

海不是蓝 | 园豆:2 (初学一级) | 2012-06-26 16:20

@海不是蓝: 需要想办法确认是不是sleep之后未能唤醒

dudu | 园豆:30778 (高人七级) | 2012-06-26 17:27

@dudu: 我只能记录日志来看是不是sleep以后有没有唤醒

海不是蓝 | 园豆:2 (初学一级) | 2012-06-26 18:06
其他回答(1)
0

搞个线程池吧!

或者换一种解决思路!

收获园豆:50
Angkor--:-- | 园豆:1086 (小虾三级) | 2012-06-26 14:36

或者 Task吧:

一:Task的优势

ThreadPool相比Thread来说具备了很多优势,但是ThreadPool却又存在一些使用上的不方便。比如:

1: ThreadPool不支持线程的取消、完成、失败通知等交互性操作;

2: ThreadPool不支持线程执行的先后次序;

 

http://www.cnblogs.com/luminji/archive/2011/05/13/2044801.html

支持(0) 反对(0) Angkor--:-- | 园豆:1086 (小虾三级) | 2012-06-26 14:38

@Angkor: Task到是没有接触过,有空好好看看,主要是现在没有办法贴代码,如果快速换一钟实现方式我先选择Quartz.NET,看了下还不错。

支持(0) 反对(0) 海不是蓝 | 园豆:2 (初学一级) | 2012-06-26 14:53
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册