A程序写入数据库,B程序查询数据库

黑娃 2014-06-20 04:42:21
需求:A程序大概5S写一次数据库,希望能将写入信息告诉C,我的想法是:A作为一个client,用tcp传给C,过程就结束了。
可是领导讨论的结果是,希望减轻A的负担,于是要把数据分发给独立出来,于是就变成了:A写数据库,然后A就不管了,自己该干嘛干嘛,增加了一个程序B,用轮询的方式读数据库,一旦读到有新东西就取出来用TCP传给C。


领导的意思是这样做虽然饶了一点,但是彼此解耦合(我上面只说了一部分,其实A想要往外传的数据比这个复杂,但总的来说频率不高,大概5S一次),其实在我看来,我更倾向于让A用异步TCP来做数据分发的事情,但是既然领导已经排定了方案,我就不倔强了。
然后我现在在思考一个问题,在我的知识范畴内,轮询都是一种不太好的方式,而B只能用轮询去感知MYSQL有没有更新,虽然这个轮询时间可能长达3S一次。
大家对此有什么建议吗?
...全文
468 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
derekrose 2014-06-20
  • 打赏
  • 举报
回复
不太清楚具体的需求 但是你领导的逻辑是不对的 论循的意义在于不确定性 你都已经确定有新的record插入了为何还要使用论循,很明显异步发送就可以了
xucong198949 2014-06-20
  • 打赏
  • 举报
回复
本人菜渣一枚,大家有不同意见轻拍~ 我觉得你们领导说的其实有道理,因为这样A可以专注于数据写入的工作,即面向对象的单一职责原则。。 轮询确实效率很低,会导致很多无用查询,而且数据量一旦很大就会导致B与C间的交互经常阻塞在查询数据库上了。。 我的建议在数据库之上做一个数据访问层,A通过数据访问层写入数据,然后这个访问层可以发送一个通知给B,B收到通知后再取数据发给C
黑娃 2014-06-20
  • 打赏
  • 举报
回复
引用 3 楼 zhao4zhong1 的回复:
Transact-SQL 参考 sp_addextendedproc 将新扩展存储过程的名称注册到 Microsoft® SQL Server™ 上。 语法 sp_addextendedproc [ @functname = ] 'procedure' , [ @dllname = ] 'dll' 参数 [ @functname = ] 'procedure' 在动态链接库 (DLL) 内调用的函数名称。procedure 的数据类型为 nvarchar(517),没有默认设置。procedure 能够可选地包含 owner.function 形式的所有者名称。 [ @dllname = ] 'dll' 包含该函数的 DLL 名称。dll 的数据类型为 varchar(255),没有默认设置。 返回代码值 0(成功)或 1(失败) 结果集 无 注释 使用 Microsoft Open Data Services 的程序员可以创建扩展存储过程。创建扩展存储过程后,必须使用 sp_addextendedproc 将此存储过程添加到 SQL Server 上。有关更多信息,请参见创建扩展存储过程。 只将一个扩展存储过程添加到 master 数据库中。若要从非 master 的数据库中执行扩展存储过程,请用 master 限定扩展存储过程的名称。 sp_addextendedproc 将条目添加到 sysobjects 中,用 SQL Server 注册新扩展存储过程名称。同样在 syscomments 表中添加一个条目。 权限 只有 sysadmin 固定服务器角色的成员才可以执行 sp_addextendedproc。 示例 下例添加 xp_hello 扩展存储过程。 USE master EXEC sp_addextendedproc xp_hello, 'xp_hello.dll' 请参见 EXECUTE GRANT REVOKE sp_dropextendedproc sp_helpextendedproc 系统存储过程 ©1988-2000 Microsoft Corporation。保留所有权利。
我用的my sql
赵4老师 2014-06-20
  • 打赏
  • 举报
回复
Transact-SQL 参考 sp_addextendedproc 将新扩展存储过程的名称注册到 Microsoft® SQL Server™ 上。 语法 sp_addextendedproc [ @functname = ] 'procedure' , [ @dllname = ] 'dll' 参数 [ @functname = ] 'procedure' 在动态链接库 (DLL) 内调用的函数名称。procedure 的数据类型为 nvarchar(517),没有默认设置。procedure 能够可选地包含 owner.function 形式的所有者名称。 [ @dllname = ] 'dll' 包含该函数的 DLL 名称。dll 的数据类型为 varchar(255),没有默认设置。 返回代码值 0(成功)或 1(失败) 结果集 无 注释 使用 Microsoft Open Data Services 的程序员可以创建扩展存储过程。创建扩展存储过程后,必须使用 sp_addextendedproc 将此存储过程添加到 SQL Server 上。有关更多信息,请参见创建扩展存储过程。 只将一个扩展存储过程添加到 master 数据库中。若要从非 master 的数据库中执行扩展存储过程,请用 master 限定扩展存储过程的名称。 sp_addextendedproc 将条目添加到 sysobjects 中,用 SQL Server 注册新扩展存储过程名称。同样在 syscomments 表中添加一个条目。 权限 只有 sysadmin 固定服务器角色的成员才可以执行 sp_addextendedproc。 示例 下例添加 xp_hello 扩展存储过程。 USE master EXEC sp_addextendedproc xp_hello, 'xp_hello.dll' 请参见 EXECUTE GRANT REVOKE sp_dropextendedproc sp_helpextendedproc 系统存储过程 ©1988-2000 Microsoft Corporation。保留所有权利。
黑娃 2014-06-20
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
在SQL Server联机帮助中搜“触发器” 可视化数据库工具 触发器
触发器这个东西,貌似怎么用都作用在数据库内部,我是想在A插入数据库的时候通知C,可是触发器做不到啊! 可是臣妾做不到啊! 可是臣妾做不到啊! 可是臣妾做不到啊! 到头来,还不是要C去轮询数据库。
赵4老师 2014-06-20
  • 打赏
  • 举报
回复
在SQL Server联机帮助中搜“触发器” 可视化数据库工具 触发器 触发器是一种特殊类型的存储过程,当使用下面的一种或多种数据修改操作在指定表中对数据进行修改时,触发器会生效:UPDATE、INSERT 或 DELETE。触发器可以查询其它表,而且可以包含复杂的 SQL 语句。它们主要用于强制复杂的业务规则或要求。例如,可以控制是否允许基于顾客的当前帐户状态插入定单。 触发器还有助于强制引用完整性,以便在添加、更新或删除表中的行时保留表之间已定义的关系。然而,强制引用完整性的最好方法是在相关表中定义主键和外键约束。如果使用数据库关系图,则可以在表之间创建关系以自动创建外键约束。有关详细信息,请参见表关系。 使用触发器的优点 触发器的优点如下: 触发器是自动的:它们在对表的数据作了任何修改(比如手工输入或者应用程序采取的操作)之后立即被激活。 触发器可以通过数据库中的相关表进行层叠更改。例如,可以在 titles 表的 title_id 列上写入一个删除触发器,以使其它表中的各匹配行采取删除操作。该触发器用 title_id 列作为唯一键,在 titleauthor、sales 及 roysched 表中对各匹配行进行定位。 触发器可以强制限制,这些限制比用 CHECK 约束所定义的更复杂。与 CHECK 约束不同的是,触发器可以引用其它表中的列。例如,触发器可以回滚试图对价格低于 10 美元的书(存储在 titles 表中)应用折扣(存储在 discounts 表中)的更新。 有关使用触发器的详细信息,请参见下列主题: 若要 请参见 创建新的触发器 创建触发器 查看现有触发器 查看触发器 更改触发器的名称 修改和重命名触发器 删除存储的触发器 删除触发器 ©1988-2000 Microsoft Corporation。保留所有权利。

5,530

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 模式及实现
社区管理员
  • 模式及实现社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧