youdianwu 回复于:2003-09-01 12:23:58 |
呵呵,怎么没人响应,高手都到哪儿去了呢? |
xuejm 回复于:2003-09-01 14:18:04 |
利用SQL就可以把“定时或者定量”的数据提取出来,然后你在这这些数据发出去不就可以了吗。
如果全部用程序来实现,你不烦? |
youdianwu 回复于:2003-09-01 14:27:49 |
楼上的:
可能我表达的不是很清楚。我的意思是每隔5分钟将该5分钟内表C中的增长记录送给机构B,下一个5分钟间隔内,只是将距离上一次发送给机构B后的在这5分钟内新增的记录送给机构B。如果仅仅用Sql实现的话,很困难。当然得用程序实现。 |
大菠萝 回复于:2003-09-01 14:30:35 |
??SQL能自己实现定时的功能吗? |
flower_open 回复于:2003-09-01 14:42:41 |
使用SQL中的触发器(对记录的增加,记录增加的数量,可能达到定量的效果;记录加个插入时间字段,就可以知道是什么时间段的了);
用SQL : select * from Table where time between last and now; //save now; |
apollolegend 回复于:2003-09-01 15:05:08 |
为什么不采用同步更新(或插入)的方式 |
xuejm 回复于:2003-09-01 15:11:48 |
我并不是说利用SQL服务器来实现定时,只说你通过SQL语句就可以提取出你需要的数据。
定时检测的功能需要用程序来实现。你可以做一个定时器来提取数据。时间间隔的大小根据需要来确定即可。 flower_open的建议也可以试一试,不过若使用出发起只为了记录数据插入的时间,那么给一个缺省值为当前日期的字段岂不来的更简单? |
youdianwu 回复于:2003-09-01 15:13:39 |
定量的问题,可以由数据库触发器触发程序的执行。定时的问题由程序自己控制(该程序里面嵌套sql语句或proc程序负责从表中取新增的数据)
表C中最好要有一个sequence字段,记录当前的记录条数,程序中应该将每一次取出数据后的最大记录条数存储在一个文件中或数据库中,然后每次取之前根据这个最大记录条数从表C中的取出(取出表C中的sequence>这个记录条数的表C的记录)。 至于定时发送的问题,我还没想好 |
stroustrup 回复于:2003-09-01 15:33:18 |
定时取数、发送不是问题,关键是怎样知道新增行达到M? |
youdianwu 回复于:2003-09-01 15:47:30 |
设置一个触发器:在每次插入表C记录时触发。
触发器的基本功能:每次插入记录时,判断当前表C的sequence字段的值减去另外一张表中存放的上一次定时/定量发送时表C的最大记录条数是否大于M,如果大于M时,就负责调用(触发)程序的执行。 不过,我个人认为最好是当达到定量时,先放一个消息到消息队列中,程序一直循环取消息,一旦有消息时,表示达到定量,然后取数据发送给机构B。程序正常情况就定时执行。只有有消息时才定量触发执行。 具体我的设计思路就是这样,但现在整个思路还不是很清楚。欢迎各位高手指定迷津。(注:本问题不是我的任务,只是提出来供大家畅谈思路。我也没接这样的工程,请大家不要误会。) |
stroustrup 回复于:2003-09-01 16:39:18 |
第一,怎么“触发”程序的执行?
第二,频繁访问该表(生产系统),性能如何? |
youdianwu 回复于:2003-09-01 20:21:38 |
回楼上的:
1。触发器里是可以直接调用可执行程序的。 2。为了实时发送批量数据,是以牺牲性能为代价的。事实上现在很多银行都有这种方面的例子。对于一些重要的中间业务,银行间竞争是异常激烈的。如果这时第三方有这种需求的话,如果你作为银行方的技术负责人,你会拒绝吗? |
kuangzy 回复于:2003-09-01 22:09:07 |
为什么要从数据库中取数据呢,把新的数据放在临时文件中(同时入库),行数(一个记录一行)达到常数M或者时间到的时候,就把文件中的内容读出来发送出去,通过设定一个变量和一个定时器就OK了。 |
sca_99 回复于:2003-09-01 23:44:02 |
一般的数据库都会提供C的API,这样你就可以通过API来执行SQL了
你可以写个后台程序通过API定时地查询数据库,通过标志可以得到定量的新数据,这样就可以实现你的要求了 |
Mike2003 回复于:2003-09-02 06:01:40 |
这个问题和你现有的处理transaction的系统结构有关,肯定有很多方法,但你需要一个最小代价。但我的直觉是利用平台(如数据库/中间间等)提供的功能。在决定使用c/c++前,do research! |
li2002 回复于:2003-09-02 07:38:42 |
这个问题应该不难解决的,可以又很多方法实现,最好应该根据你具体的系统而定。 |
qjlemon 回复于:2003-09-02 08:26:58 |
从实用的角度,如果两边都是同种数据库的话,可以看看数据库本身有没有自动复制的功能,比如SQL Server就可以把两个数据库配成自动同步,根本不需要写程序。
如果这样不行的话,用触发器也可以。触发器都没有,比如mysql,那就没办法,定时扫描吧。 |
蓝色键盘 回复于:2003-09-02 10:56:05 |
问题: A行要求做B机构的代理中间业务。B机构对某些信息要求实时了解。这些信息存放在A行中的表C中,该表实时增长。B机构要求A行每隔5分钟将新增的这些敏感信息传送给机构B,并且只要表C中的新增的记录条数超过一个指定常数M条时,即使还不到间隔时间5分钟,A行也应实时将这些新增的信息发送给机构B。
按照问题去做不就行了吗?? 1、你可以完全不写高级语言的代码。如果机构B对性能要求不是很高的话,用shell大概就能完成你的任务。但是对于条件M是否能过用脚本来操作,偶不清楚。看你自己了。 2、用程序来完成,性能能够好一些。你说的用队列实现也可以。但是偶觉得没必要。A机构获得增量的数据发送给B机构的服务程序,然后由那个服务程序完成B机构的数据库更新。 3、用数据库本身的机制,如前面几个兄弟所说的触发器,数据同步等措施。具体的做法要看你用什么数据库。楼主似乎是oracle,可能是中行或商业银行等。这个实现,需要问问客户是否可以用数据库机制。有些银行不希望你用这样的措施。 附注:如果更复杂一些,A行中的主机存放表C ,要求A行中的前置负责和机构B通讯,你编写的程序位于前置机,前置机和主机的接口你可以自定义,你认为该接口又如何定义比较好呢? 回答:这个接口需要和你的客户讨论。没有什么固定的模式。不论前置机在哪里,只要网络可达、数据库权限足够,操作是一样的。前置从主机获取数据后转发给负责更新机构B的服务程序便可。 |
youdianwu 回复于:2003-09-02 10:56:58 |
最起码的要求是,肯定要用程序来实现。从数据库远程拷贝是不现实的。如果大家做过和第三方的中间业务的话,都会明白这个道理。另外说明:这个问题是个现实问题。所以设计思路也应该符合现实问题。
(最基本的现实问题:和第三方通讯都是通过通讯前置机进行,为什么?为了安全。所以对于这种实时批量数据传送,只能依靠双方的程序通过通讯方式才行。) 当然我现在只是提出现在一个业界很流行的现实问题,欢迎各位畅谈,最好是能符合实际的,不要理论性的 |
蓝色键盘 回复于:2003-09-02 11:07:26 |
中间业务的程序偶做了不少。
如果用程序,不就是通讯的问题。用socket便可。至于怎么接受和处理和更新数据,这个应该很简单。 |
youdianwu 回复于:2003-09-02 11:17:11 |
本问题最终结果是达到明确的设计思路,而且肯定是要用程序实现,我们可以暂定为c/c++,假定数据库为oracle.A行中有前置机和主机,对于A行而言,只知道和B机构关于这个实时发送的接口。我门现在可以排除一些不现实的东西,和为了简化问题,可直接认为我们要编写的程序和数据库是在同一台机器上,而且就是这台机器负责和机构B通讯。现在直接对关于这个问题涉及到的数据库设计(表C和其他可自行增加的表)、程序的流程设计进行讨论:
我认为: 1。数据库设计方面:第一:表C中需要有sequence字段和交易日期字段,这两个字段必不可少,其他字段就是第三方机构B需要的敏感信息。 第二:另外一张参数表:用于存放上一次实时批量数据上送时的表C中的最大记录条数(即当时表C中的sequence的值) 2。关于程序流程设计,我还未清晰确定。不过已经有思路。 现在:大家可以直接讨论关于这个问题的数据库设计还有什么不妥的? (注:本问题的提出和解决决定会大大提高自己分析设计的能力,包括我自己在内,事实上,这种问题比毕业设计所谓的课题还现实。) |
蓝色键盘 回复于:2003-09-02 11:27:25 |
如果偶没有猜错的话,你毕业的时间不长,可能刚开始做项目,如果这样的话,这些项目会让你得到不少长进的。
偶在说点废话: 1。数据库设计方面:第一:表C中需要有sequence字段和交易日期字段,这两个字段必不可少,其他字段就是第三方机构B需要的敏感信息。 建议:表C的设计就两个原则: (1)、必须包含机构B需要的数据信息字段。 (2)、必须能够由一种能够标识增量的字段。 第二:另外一张参数表:用于存放上一次实时批量数据上送时的表C中的最大 记录条数(即当时表C中的sequence的值) 建议:这个参数表根本不需要,如果你的表C设计的好的话。 2。关于程序流程设计,我还未清晰确定。不过已经有思路。 建议:这个纯粹是通讯程序的设计问题。这部分应该更简单。只要网络可达,接口一致。就算前置和用户环境随便怎么变化都无所谓! |
youdianwu 回复于:2003-09-02 11:38:46 |
呵呵,斑竹,本人已经工作2年了,想到这个问题,就共享出来,只是想提高自己的分析设计能力。和我的工作无关!!!
关于你说的数据库设计方面,偶不敢苟同。 我认为那张参数表必不可少。你说的在表C中添加一个能够标志增量的字段,这个字段在数据库设计中是很难实现的。 我个人认为,为了实现能够标志这个增量的目的:在表C中增加sequence字段和交易日期字段。在参数表中增加一个用于存放上一次实时批量数据上送时的表C中的最大 记录条数(即当时表C中的sequence的值) 的字段。可以实现达到标志表C中的增量目的。 注意:表C的记录是不允许删除的。所以它是一直增长的。为了达到标志在一个指定间隔时间内的数据增量,我想不出更好的办法。 关于程序设计:我们可以首先假定:通讯程序不用写。因为假定第三方机构B提供给A行的接口。该接口就能实现通讯。所以需要设计的程序功能就是取出满足要求的数据后,然后调用机构B的接口送到机构B即可。所以对于程序方面:主要的问题集中在程序的业务逻辑上设计。 |
sca_99 回复于:2003-09-02 11:50:42 |
哇,真有时间,为了这个问题讨论那么多
用PROC或OCI做调用写个后台进程不就可以了吗,关于库表问题根据实际情况而定,问题不就解决了 |
蓝色键盘 回复于:2003-09-02 11:54:07 |
[code:1:914fa9eeb9]个人认为,为了实现能够标志这个增量的目的:在表C中增加sequence字段和交易日期字段。在参数表中增加一个用于存放上一次实时批量数据上送时的表C中的最大 记录条数(即当时表C中的sequence的值) 的字段。可以实现达到标志表C中的增量目的。
注意:表C的记录是不允许删除的。所以它是一直增长的。为了达到标志在一个指定间隔时间内的数据增量,我想不出更好的办法。 [/code:1:914fa9eeb9] 兄弟,你只读取增量的数据不就行了吗?你要每次上载的时候当时表C中的sequence值有什么意义。除非你没办法标识哪些数据是增量的。 现在打个比方:假如以时间和一个标志字段(为1,标识没有增量发送,为0标识已经增量发送)为增量的标志。那么你查找表C的时候,是要where 日期 and 标志 。如果找到了。并确发送成功了,你会设置发送出去的记录的标志为0。至于表里面有多少数据,以及记录上次增量了多少,我觉得没有意义! |
qjlemon 回复于:2003-09-02 12:17:21 |
就是啊,不需要什么sequence之类的东东,大不了每个记录加一个标志字段,取数据前开始个transaction, 取完后把标志位改掉,再commit transaction, 看,多么完美的解决方案 :lol: :lol: :lol: |
youdianwu 回复于:2003-09-02 12:34:48 |
关于数据库设计方面,我同意上述2位的做法,放弃我原来的数据库设计思想。
现在假定:表C中有一个标志字段,和其他敏感信息字段。 另外参数表中的字段废弃掉,使数据库设计简单化。 现在我们来讨论程序业务逻辑流程的设计。 先讨论关于程序如何知道增量达到定量M条的情况: 我的想法是:假设某交易T负责插入表C,那就在交易T里插入表c记录之后,增加代码判断是否当时增量达到M数量级,如果是就 调用我们编写的程序负责发送给机构B。 废弃插入触发器的做法,该做法不现实。 |
xa_butterfly 回复于:2003-09-02 16:39:54 |
楼上各位的讨论让我受益非浅.
"关于程序如何知道增量达到定量M条的情况" 我的拙见是:在主程序上创建一个监视线程,有它统计表c中标识为1的记录条目,如果结果达到M,那么给主程序发送信号SIGUSR,在信号处理程序中调用处理,发送新增记录到机构B |
kuangzy 回复于:2003-09-02 21:47:41 |
楼上说的不行,因为程序里面还有个时间限制,时间到了,就得发数据;你起的那个监听统计进程隔多长时间去统计一次呢?
还有就是如果程序需要重启,而这时还有些新的信息没有发送给客户端,是否需要在程序完全退出之前把新数据处理完了或者把新增记录数N给保存起来以便下次启动时上一次的新增记录仍然有效。 |
Mike2003 回复于:2003-09-02 21:55:31 |
肯定有多种方法实现,但你需要一个最小代价。我觉得最佳方案和你的系统结构有关,直觉是充分利用现有的支撑平台(如数据库/中间件等)提供的功能。如果最后你使用c/c++实现所有的功能,应该不是一个最佳办法。 |
stroustrup 回复于:2003-09-03 09:52:28 |
这跟你的生产环境、中间业务环境等有关。
偶看没有什么最好的方法,具体情况具体做法。 关键是实现第三方要求的功能就行了。 |
winning 回复于:2003-09-03 15:31:50 |
在数据库表中必须包含记录序号和插入时间两个字段,然后存储过程中判断增量记录数是否达到M和时间间隔是否达到约定间隔,如果满足两个条件中的任意一个,将数据取出return各调用程序,调用程序在把数据通过接口送给B机构即可。 |
jourmen 回复于:2003-09-08 16:26:10 |
我没有具体看清所有的楼上的贴
我把我现在做的工作说一下吧(有与楼主相同处理的地方): 关于数据:用tigger,条件设定好判断一下,把数据增量导出(不知道你的数据库支持不?)到一个文件里头。数据发送从这个文件里读取。 关于数据传送:我们用的是IBM的MQ,发送和接收的程序自己写的。 |
improgrammer 回复于:2004-02-24 23:06:28 |
入库的接口必须统一:比如Table_C::entry(...);——业务对象。
Table_C类在数据入表C时记数、记时,也就是说,体现和B公司的协议(业务逻辑)。为了避免过于频繁地访问C表,可专门开实时记录集合RS(或表)。 当时间到或记录数足后,完成通讯,然后清空RS表,确定下次通讯时间,记录数清0。 Table_C类可以访问另外的通讯部件,在必要的时候将数据发往B公司。 |