最近公司里做一个服务器端的监控程序,需要每秒从多个不同的数据源获取数据,并更新到一张内存表中,以便其他的模块调用这些实时数据.由于数据量比较大,而且取数据的过程必须在1秒内完成,否则就失去了实时的意义.我的做法是:为每个数据源设一个TIMER定时器,在定时器调用的方法中再设多个子线程,将数据分成多个小块再读取.
实际实现的时候遇到了很多问题:
1.按照设计文档的要求是写一个Connection作为全局变量,在个子线程中调用,然而我发现各个TIMER中调用同一个Connection时会发生并发的异常(lock后就不会出现异常了),而在TIMER的子线程里则不会出现并发的异常,这是为什么?
2.按道理来说分了子线程数据读取速度应该比一次读取全部数据要快,但从测试结果来看,一个数据读取周期依然是所有子线程花费的时间总和,是我的测试有误差,还是其他什么原因吗?
3.有个数据源的数据量很大,大概是38万条,而读取数据时,由于每条数据的读取条件不同,即便是一次需要读几千条数据,也只能一条一条的读,而每读条就要花费0.3秒的时间(还没算打开连接,和处理数据的时间),请问这样的数据库能做到一秒钟之内把所有需要的数据都读出来吗(一次大概要读几千条记录,而且只能一条一条的读)?
总的来说,感觉多线程并不是同时执行的,很多时候数据根本出不来,线程好象被卡住了,而有时候一下出来很多数据.多线程对于我的这个项目是否真的有意义呢?
这个问题解决不了,后面的项目就没法做了.还请高手帮帮忙吧
实际实现的时候遇到了很多问题:
1.按照设计文档的要求是写一个Connection作为全局变量,在个子线程中调用,然而我发现各个TIMER中调用同一个Connection时会发生并发的异常(lock后就不会出现异常了),而在TIMER的子线程里则不会出现并发的异常,这是为什么?
2.按道理来说分了子线程数据读取速度应该比一次读取全部数据要快,但从测试结果来看,一个数据读取周期依然是所有子线程花费的时间总和,是我的测试有误差,还是其他什么原因吗?
3.有个数据源的数据量很大,大概是38万条,而读取数据时,由于每条数据的读取条件不同,即便是一次需要读几千条数据,也只能一条一条的读,而每读条就要花费0.3秒的时间(还没算打开连接,和处理数据的时间),请问这样的数据库能做到一秒钟之内把所有需要的数据都读出来吗(一次大概要读几千条记录,而且只能一条一条的读)?
总的来说,感觉多线程并不是同时执行的,很多时候数据根本出不来,线程好象被卡住了,而有时候一下出来很多数据.多线程对于我的这个项目是否真的有意义呢?
这个问题解决不了,后面的项目就没法做了.还请高手帮帮忙吧
2.在你的一个线程占用资源过大,你同时开十几个同样的线程跟有可能会造成更慢的速度,看看windows系统复制文件就知道了,并不是同时复制10个1G的文件比顺序复制10个1G的文件慢
3.读取一条数据需要0.3秒,说明你的代码严重有问题
4.访问冲突,因为你用了lock锁定资源,别的进程肯定用不了,要不然lock就没有意义了
写操作的时候用LOCK还是有点用的.