论文部分内容阅读
[摘要]防汛水雨情数据的网络传输,尤其是通过广域网的传输,其稳定性、完整性、实时性尤其重要。通过与常用数据传输方法的比较,说明采用数据库触发器和作业调度方式传输数据的优点,分析用此方法传送水雨情数据时应考虑的几个问题,说明具体实现方法及改进措施。
[关键词]触发器 作业调度 水雨情
中图分类号:P4文献标识码:A 文章编号:1671-7597(2008)1010149-01
一、数据库分布现状
水雨情数据是防汛防旱防台工作的基础数据,对于掌握实时汛情动态、作出防汛决策、减少国家和人民生命财产损失具有重要的意义。
近年来水雨情自动遥测系统的建设越来越普及,由于建设时间、承建单位、使用对象的不同,导致数据库结构、物理存储位置的不同。据统计,目前我市已建遥测站点140多个,市防汛办和各县防汛办水雨情数据库5个,另有人工报汛数据库1个,数据库均采用SQLSERVER 2000以上版本。数据分布于不同的数据库,给数据检索、统计、比测、传输等工作带来很大不便。如图1所示,全市6个数据库,除了为防汛应用软件提供数据外,还需要通过广域网逐级向上传送。县级数据库传至市级数据库,市级数据库传至省级数据库,最后传送至国家防汛总指挥部。
为便于数据传输和应用,在市防汛网络中,创建一个中心数据库,用于收集全市所有的水雨情数据,并通过该数据库向省级数据库发送数据。

二、采用触发器和作业调度方式传送数据的优点
按照惯例,数据传输需要编写用于收、发数据的通讯软件。通讯软件原理虽然简单,但由于涉及数据库连接、网络通讯、数据协议等多个方面的问题,还需要考虑运行的安全性和稳定性等问题(如网络异常时确保程序不会出现异常终止和数据丢失,网络恢复正常时软件能自动恢复数据传输);在广域网上调试和运行通讯程序时,需要对远端电脑拥有足够的权限来运行EXE程序;系统重启时,要考虑等待SQLSERVER重启完毕才能运行收发软件。因此,要编写一个稳定、可靠的传输程序往往比较烦琐,需要经过反复测试和长期试用才能成功。为此,我们探索了一种通过数据库触发器和作业调度传输数据的方法。
所谓数据库触发器,简单地说,就是指数据库发生数据插入(insert)、删除(delete)、修改(update)等操作时执行的一段SQL语句;所谓作业,就是指在规定的时间内需要执行的一段SQL语句。触发器和作业可以通过SQLSERVER企业管理器进行编辑,以文本格式存储于数据库中,由SQLSERVER自动执行。它可以克服EXE格式的通讯软件的各类弊端。而且,文本格式的代码,便于修改维护。
三、实现方法
(一)采用触发器和作业方式传输水雨情数据时,重点考虑三个问题
1.确保数据的安全性和完整性。如果网络连接或远程数据库发生故障,则数据传输失败,导致整个触发器和作业的异常中止。在此情况下,应该保留待传输的数据,等故障恢复时能自动进行重传。但触发器只在数据改变时发生一次,运行失败后,SQLSERVER不再重试。因此,数据传输功能只适合于放在作业中,通过作业调度不停地得到执行。需要传输的数据应先通过触发器放入一个临时表中,传输成功后再删除临时表中的数据。
一般情况下,一个作业由许多条SQL语句组成,作为一个事务来处理,如果中间某条SQL语句失败,则SQLSERVER回滚事务,导致作业中所有语句失败。因此数据传输应单独作为一个作业,不宜将其他功能(如字段运算、代码转换、数据备份等)跟数据传输放在同一个作业中。
2.作业调度时间的确定。作业调度时间不宜过短或过长。过短则导致服务器频繁执行作业,加重服务器和网络的负担;过长则可能无法满足防汛调度和水雨情预警工作的需要。按照国家防总的有关规定,水雨情达到加报或预警标准的,要立即进行加报。因此,对重要的水雨情信息,应尽快向上级报送。根据防汛调度和水雨情预警需要,结合服务器负载情况,一般作业调度时间可选择在1~5分钟之间。若按3分钟调度一次作业计,考虑到遥测站自身时钟可能有3分钟延迟,则市级数据库最大延迟6分钟,省级数据库最大延迟9分钟,传至国家防总时最大延迟为12分钟。具体时间应考虑水闸、水库等工程最大可能的水位涨速、历史最大雨量情况来调整,以满足防汛工作的需要。
3.数据库表批量处理时的安全性。在做数据库维护时,有时需要对表进行插入、修改等批量处理。当水雨情数据库比较庞大时,如果对带有触发器的数据库表进行批量处理,可能导致触发器被频繁触发,引起服务器长时间负载过重。因此,批量处理前,应考虑先停止触发器和作业的功能,待数据批量处理完毕,用SQLSERVER的查询分析器一次性执行触发器和作业的功能,最后再恢复触发器和作业,这样整体上可以大大缩短批量处理时间。
(二)实现步骤
一般我们都在发送端执行数据库触发器和作业调度。在SQLSERVER企业管理器中按以下步骤操作:
1.为需要发送数据的表创建一个结构相同的临时表。
2.创建insert触发器,将新增数据加入临时表;创建delete触发器,将数据从临时表中删除。
3.建立连接远程数据库的链接服务器,使当前服务器能与远程服务器连接。
4.建立一个定时执行的作业,将临时表中的数据通过链接服务器拷贝到远程服务器,并删除临时表中的记录(若拷贝语句失败,则作业自动终止,删除语句不会被执行,待发送的数据仍存在于临时表中)。
(三)改进方法
以上方法只说明了实现传输的基本方法。具体实践时,可以进一步完善,因为按以上方法,每个表都需要创建一个临时表,表多时比较麻烦。可以将上述传送数据的方法,改成传送SQL语句。按以下方法,在发送端仅需创建一个临时表:
1.在各个触发器中,为每一条记录生成一条对应的SQL语句,并放入临时表中(在Insert触发器中,生成insert语句;在Delete触发器中,生成delete语句)。
2.在作业中,将临时表中的SQL语句传到远程服务器。
3.远程服务器创建一个作业,定时执行收到的SQL语句。
[关键词]触发器 作业调度 水雨情
中图分类号:P4文献标识码:A 文章编号:1671-7597(2008)1010149-01
一、数据库分布现状
水雨情数据是防汛防旱防台工作的基础数据,对于掌握实时汛情动态、作出防汛决策、减少国家和人民生命财产损失具有重要的意义。
近年来水雨情自动遥测系统的建设越来越普及,由于建设时间、承建单位、使用对象的不同,导致数据库结构、物理存储位置的不同。据统计,目前我市已建遥测站点140多个,市防汛办和各县防汛办水雨情数据库5个,另有人工报汛数据库1个,数据库均采用SQLSERVER 2000以上版本。数据分布于不同的数据库,给数据检索、统计、比测、传输等工作带来很大不便。如图1所示,全市6个数据库,除了为防汛应用软件提供数据外,还需要通过广域网逐级向上传送。县级数据库传至市级数据库,市级数据库传至省级数据库,最后传送至国家防汛总指挥部。
为便于数据传输和应用,在市防汛网络中,创建一个中心数据库,用于收集全市所有的水雨情数据,并通过该数据库向省级数据库发送数据。

二、采用触发器和作业调度方式传送数据的优点
按照惯例,数据传输需要编写用于收、发数据的通讯软件。通讯软件原理虽然简单,但由于涉及数据库连接、网络通讯、数据协议等多个方面的问题,还需要考虑运行的安全性和稳定性等问题(如网络异常时确保程序不会出现异常终止和数据丢失,网络恢复正常时软件能自动恢复数据传输);在广域网上调试和运行通讯程序时,需要对远端电脑拥有足够的权限来运行EXE程序;系统重启时,要考虑等待SQLSERVER重启完毕才能运行收发软件。因此,要编写一个稳定、可靠的传输程序往往比较烦琐,需要经过反复测试和长期试用才能成功。为此,我们探索了一种通过数据库触发器和作业调度传输数据的方法。
所谓数据库触发器,简单地说,就是指数据库发生数据插入(insert)、删除(delete)、修改(update)等操作时执行的一段SQL语句;所谓作业,就是指在规定的时间内需要执行的一段SQL语句。触发器和作业可以通过SQLSERVER企业管理器进行编辑,以文本格式存储于数据库中,由SQLSERVER自动执行。它可以克服EXE格式的通讯软件的各类弊端。而且,文本格式的代码,便于修改维护。
三、实现方法
(一)采用触发器和作业方式传输水雨情数据时,重点考虑三个问题
1.确保数据的安全性和完整性。如果网络连接或远程数据库发生故障,则数据传输失败,导致整个触发器和作业的异常中止。在此情况下,应该保留待传输的数据,等故障恢复时能自动进行重传。但触发器只在数据改变时发生一次,运行失败后,SQLSERVER不再重试。因此,数据传输功能只适合于放在作业中,通过作业调度不停地得到执行。需要传输的数据应先通过触发器放入一个临时表中,传输成功后再删除临时表中的数据。
一般情况下,一个作业由许多条SQL语句组成,作为一个事务来处理,如果中间某条SQL语句失败,则SQLSERVER回滚事务,导致作业中所有语句失败。因此数据传输应单独作为一个作业,不宜将其他功能(如字段运算、代码转换、数据备份等)跟数据传输放在同一个作业中。
2.作业调度时间的确定。作业调度时间不宜过短或过长。过短则导致服务器频繁执行作业,加重服务器和网络的负担;过长则可能无法满足防汛调度和水雨情预警工作的需要。按照国家防总的有关规定,水雨情达到加报或预警标准的,要立即进行加报。因此,对重要的水雨情信息,应尽快向上级报送。根据防汛调度和水雨情预警需要,结合服务器负载情况,一般作业调度时间可选择在1~5分钟之间。若按3分钟调度一次作业计,考虑到遥测站自身时钟可能有3分钟延迟,则市级数据库最大延迟6分钟,省级数据库最大延迟9分钟,传至国家防总时最大延迟为12分钟。具体时间应考虑水闸、水库等工程最大可能的水位涨速、历史最大雨量情况来调整,以满足防汛工作的需要。
3.数据库表批量处理时的安全性。在做数据库维护时,有时需要对表进行插入、修改等批量处理。当水雨情数据库比较庞大时,如果对带有触发器的数据库表进行批量处理,可能导致触发器被频繁触发,引起服务器长时间负载过重。因此,批量处理前,应考虑先停止触发器和作业的功能,待数据批量处理完毕,用SQLSERVER的查询分析器一次性执行触发器和作业的功能,最后再恢复触发器和作业,这样整体上可以大大缩短批量处理时间。
(二)实现步骤
一般我们都在发送端执行数据库触发器和作业调度。在SQLSERVER企业管理器中按以下步骤操作:
1.为需要发送数据的表创建一个结构相同的临时表。
2.创建insert触发器,将新增数据加入临时表;创建delete触发器,将数据从临时表中删除。
3.建立连接远程数据库的链接服务器,使当前服务器能与远程服务器连接。
4.建立一个定时执行的作业,将临时表中的数据通过链接服务器拷贝到远程服务器,并删除临时表中的记录(若拷贝语句失败,则作业自动终止,删除语句不会被执行,待发送的数据仍存在于临时表中)。
(三)改进方法
以上方法只说明了实现传输的基本方法。具体实践时,可以进一步完善,因为按以上方法,每个表都需要创建一个临时表,表多时比较麻烦。可以将上述传送数据的方法,改成传送SQL语句。按以下方法,在发送端仅需创建一个临时表:
1.在各个触发器中,为每一条记录生成一条对应的SQL语句,并放入临时表中(在Insert触发器中,生成insert语句;在Delete触发器中,生成delete语句)。
2.在作业中,将临时表中的SQL语句传到远程服务器。
3.远程服务器创建一个作业,定时执行收到的SQL语句。