sql server2000数据库中有20张表,每张表中的记录都在增长,大概为每分钟10-50条,现在我需要在前台编写一个程序,实时读取数据表中新增加的记录,想法是使用System.timer计时器,每10秒钟读取一次数据库,取出数据,现在的问题是我应该使用一个timer,添加20个elapsed事件对各表进行操作(已做防止重入),还是使用20个timer分别对每张表进行操作?如果当系统中有20个timer同时运行的时候,长时间运行(几个月)程序的稳定性如何?望大家指点,谢谢

解决方案 »

  1.   

    用一个存储过程直接返回20个表,一个DataSet装进20个DataTable中就行了
      

  2.   

    谢谢楼上几位,我想知道多个timer在长期运行(几个月甚至几年)的过程中稳定性如何?在程序逻辑没有问题的时候它会不会自己宕掉?
      

  3.   

    还有就是对于一个timer中定义的多个elapsed事件,它们被触发执行的时候是单线顺次执行还是多线程并发执行呢?
      

  4.   

    这个用得着这么设计么?不就是要获得新数据么?给数据上添加一个字段IsNew不就完了么?新写入未读取的IsNew为ture,读过的设置为false下次不再读取
      

  5.   

    一个timer,然后用存储过程获取20张表
      

  6.   

    稳定性不会有问题的。相当于你添加一个elapsed事件,把所有方法写在一起执行。它的好处是方便组件编程,部分常用事件可以集成到特定的组件中,同时又支持用户新增事件。除此之外和使用委托来执行没差别,不用到组件编程的话,可以不考虑使用那个Timer,使用System.Threading.Timer来操作。
      

  7.   

    这个读取方法不错,能否细化一下?
    我把我的程序和目标说一下吧,大家帮我分析分析:
        本地有一个SQL Server2000数据库,数据库中有20张表(由第三方软件建立),第三方软件一直在向此20张表中写入记录,大概每张表为10-50条每分钟,远程有一个ORICAL数据库,数据库中表的格式与本地数据库相同,我现在需要做一个传输系统,在本地感知本地数据库各表中由第三方软件新插入的记录,实时将其发送到远程的数据库中(本地与远程数据传输的过程由消息中间件完成)。
        我现在的做法是在发送端程序中建立了20个System.timer,每个timer控制一张表的数据读取、传输。
    对于每个timer,具体为每10秒钟触发一次elapsed事件,在事件中先连接数据库,select新插入的记录,通过datareader读到程序中,写成一条条insert格式的sql语句,然后将sql语句通过消息中间件传输到远程,然后远程接收程序直接执行sql语句,插入到远程数据库中。各位看我这样的做法有没有不妥?如果有更好的方法,请多指点,谢谢
      

  8.   

    应当使用一个Timer,然后添加20个elapsed事件,原因如下:
    每一个Timer其实都是使用一个Threading pool线程池里面的线程,如果使用20个Timer,相当于同时开了20个线程,这是资源的浪费,造成了不必要得开销。程序中的异步调用,异步io等都是使用线程池里面的线程。同一个Timer的elapsed被触发执行的时候是单线顺次执行的
      

  9.   

    用委托 可以下一个方法条用多个事件  节省cpu 强烈建议 !!!
      

  10.   

    在本地数据库那块,我用的是对每张表建立一张临时表,并在原表上建立触发器,当原表中有记录插入时,触发器向临时表中插入该记录,每次程序读取临时表中的记录,传输后再删除之(rowid作为标记)。
    你能说说用存储过程操作的流程吗?是不是对每张表建立一个存储过程,主程序中运行一个timer,每次触发时程序执行各存储过程,然后把数据表的记录读入到程序中?我是新手~~~ps:作业定时只能最短每小时执行一次吧?
      

  11.   

    学习了,用着20个timer总觉得心惊胆战的,总怕不稳定,虽然也做了lock和防重入
      

  12.   

    20 个 Timer 也没关系的
      

  13.   

    楼主最终的目的是想数据同步对吧,假定本地是sql2k,远程是oracle。
    你的想法是,写一个winform程序,利用定时器读取本地的数据,然后同步到远程的数据库。
    而我上面的说法是不用写这个winform程序,即数据库对数据库直接操作:
    你可以在sql2k本地,写这个存储过程。
    首先sql2k是可以通过添加链接服务器(即添加远程oracle数据库)来操作远端数据库数据的;然后用存储过程完成数据同步过程(的主要内容就是数据处理了:包括判断更新哪些数据、数据同步,已同步数据的标记的等);最后,添加定时作业,sql2k的作业是可以重复到秒的。另外建议用作业方式,这样能够更节省主机资源。这里要注意到几点:1,要确保作业执行用户对表的具有操作权限;2,sql2k下添加链接服务器,因为远端是oracle,故应该首先在本地安装oracle的客户端。
      

  14.   

    谢谢耐心解答,这个方法确实不错,直接利用数据库功能实现,但是现在估计我只能用写程序的方法完成了,因为1.除了本地的sql2000,还有其他两个地方的两个SQL2000数据库的数据也要同步到远端的oracle中,即3个数据库的数据要传输到一个oracle数据库中,不知道这样同步是够可行2.公司已经采购了消息中间件产品,总之,非常感谢,
      

  15.   

    其实这个同步可以自己写SQL语句,定时执行,没必要用中间件,除非钱多。不建议使用代理作业方式完成,稳定性很成问题,比如代理关闭了啊,代理执行日期错误啊,虽然这些错误可以查看作业日志,但是作业日志的查看是很麻烦的事,而且不是人人有这个权限看的,不便于及时发现问题。所以作业方式不可取,只能凑合着用用。