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

解决方案 »

  1.   

    1.按照设计文档的要求是写一个Connection作为全局变量这个是错的,在vs里,你只需要把连接随时建立使用用完随时关闭就可以了,它是自动受连接池管理的。没有lock时发生异常是因为并发访问造成了访问冲突,lock后就避免了这种冲突,但是同时也造成这个connection是数据的唯一通道而致使性能下降
      

  2.   

    1.连接可以需要的时候建立,用完立即关闭
    2.在你的一个线程占用资源过大,你同时开十几个同样的线程跟有可能会造成更慢的速度,看看windows系统复制文件就知道了,并不是同时复制10个1G的文件比顺序复制10个1G的文件慢
    3.读取一条数据需要0.3秒,说明你的代码严重有问题
    4.访问冲突,因为你用了lock锁定资源,别的进程肯定用不了,要不然lock就没有意义了
      

  3.   

    在读操作的时候我的建议就是LZ你直接读就可以了,不用多线程和LOCK.这样反倒慢.
    写操作的时候用LOCK还是有点用的.