现在做一个程序,windows服务,工作任务就是从mongodb数据库中读取数据,然后处理下保存到其它服务端数据库上。
像日志这样的大数据库都是游标处理,处理完了等几分钟再从最后取到的地方再取,其它的就是凌晨的时候备份,这些线程我都是采用的sleep的方式来控制暂停的。
由于特定的任务多,所以线程比较多。比如有些线程会休眠sleep 几个小时。
但是程序在服务器上运行几天以后就会出现数据库不进数据了,但是windows服务上程序是正常的,没有挂或者停止,日志也不写了。
一直没找到问题,怀疑是sleep睡了可能没醒,我这里也没有设置线程优先等级,有经验的大虾给个问题可能的出现原因和解决方案
“有些线程会休眠sleep几个小时”,为什么不用任务调度方式,比如用Quartz.NET
如果你还是坚持用sleep的方式,能不能贴出sleep与wakeup的主要代码?
不好意思,工作的电脑是另外一台,不能外网的,是游戏数据库,区服比较多,每个区服又有几个线程任务,假如单个游戏区服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的,所有区服数据库的数据量上亿级的。
@海不是蓝: 检查过Windows事件日志了吗?
@dudu: 运维说没有日志,程序是正常的,状态是启动,没有停止
@海不是蓝: 需要想办法确认是不是sleep之后未能唤醒
@dudu: 我只能记录日志来看是不是sleep以后有没有唤醒
搞个线程池吧!
或者换一种解决思路!
或者 Task吧:
一:Task的优势
ThreadPool相比Thread来说具备了很多优势,但是ThreadPool却又存在一些使用上的不方便。比如:
1: ThreadPool不支持线程的取消、完成、失败通知等交互性操作;
2: ThreadPool不支持线程执行的先后次序;
http://www.cnblogs.com/luminji/archive/2011/05/13/2044801.html
@Angkor: Task到是没有接触过,有空好好看看,主要是现在没有办法贴代码,如果快速换一钟实现方式我先选择Quartz.NET,看了下还不错。