栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何将数据从数据库推送到应用程序?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何将数据从数据库推送到应用程序?

当然,有几种可能性可以做到这一点:

  • 实施不安全的CLR触发器
  • 实施不安全的CLR程序
  • 使用xp_cmdshell
  • 致电网络服务
  • 使用查询通知

就个人而言,与其他方法相比,我更喜欢查询通知,因为它已经支持多种情况(例如,同步/异步通信),并且您不必重新发明轮子。并且在您的情况下由Microsoft建议。

轮询是您提到的另一种方法。它更像是传统方法,并且可能会有一些性能损失,但是如果您足够小心,就不必担心它们。例如,如果您已经在应用程序中内置了身份验证,则可以在您的应用程序中创建另一列

Users
如果该用户有任何更改,则设置该表。然后,您的应用程序中可能只有一个线程,它将每秒对该表执行一次查询(即使使用NOLOCK进行脏读也不是问题),并维护一些内存结构(例如线程安全的字典)那说明应该推动哪个客户。另一个线程轮询您的字典,当它找到适合客户端的内容时,执行db查询以提取数据并将其发送给客户端。这看起来像很多不必要的工作,但是最后您得到了两个独立的工作人员,这在一定程度上有助于分离问题。第一个只是执行“轻量级”数据库轮询的通知程序;第二个提取真实数据并执行服务器推送。您甚至可以按其运行时的方式来优化推手,它检查多个客户端是否需要一些数据,然后对所有需要这些数据的人执行选择。您可能希望第二个工作人员的运行频率低于第一个工作人员。

编辑

如果希望使用非.NET技术来实现相同的功能,则必须更多地使用SQL Server Service Broker。查询通知是SQL ServerServiceBroker上.NET中内置的简化层,您必须自己至少构建该层的一部分。这包括使用另一端的SEND和RECEIVE创建队列,消息类型,服务和存储过程。您将必须自己处理对话/对话。SB实际上是经过调整的异步消息世界,可以在RDBMS环境中工作,因此您将看到一些新的TSQL表达式。但是,MSDN可以为您提供帮助:

  • http://msdn.microsoft.com/zh-CN/library/ms166061(v=sql.105).aspx
  • http://msdn.microsoft.com/en-us/library/bb522893.aspx

有关如何编写内容的示例:

-- First you have to enable SB for your databaseUSE masterALTER DATAbase PlaygroundSET ENABLE_BROKERGOUSE PlaygroundGO-- Then create a message type; usually it will be XML-- because it's very easy to serialize/deserialize itCREATE MESSAGE TYPE [//Playground/YourMessageType]VALIDATION = WELL_FORMED_XMLGO-- Then create a contract to have a rule for communication-- Specifies who sends which message typeCREATE ConTRACT [//Playground/YourContract] (    [//Playground/YourMessageType] SENT BY ANY)GO--Creates queues, one for initiator (1) and one for target (2)CREATE QUEUE MyQueue1GOCREATE QUEUE MyQueue2GO-- Finally, configure services that 'consume' queuesCREATE SERVICE [//Playground/YourService1]ON QUEUE MyQueue1 ([//Playground/YourContract])GOCREATE SERVICE [//Playground/YourService2] ON QUEUE MyQueue2 ([//Playground/YourContract])GO-- Now you can send a message from service to service using contractDECLARE     @dHandle uniqueidentifier,    @Msg nvarchar(max)BEGIN DIALOG @dHandle    FROM SERVICE [//Playground/YourService1]    TO SERVICE '//Playground/YourService2'    ON ConTRACT [//Playground/YourContract]WITH ENCRYPTION = OFFSELECt @Msg = (    SELECT TOP 3 *    FROM Table1    FOR XML PATH('row'), ROOT('Table1'));SEND ON ConVERSATION @dHandle MESSAGE TYPE [//Playground/YourMessageType] (@Msg)PRINT @MsgGO-- To get the message on the other end, use RECEIVE-- Execute this in another query windowDECLARE @dHandle uniqueidentifierDECLARE @MsgType nvarchar(128)DECLARE @Msg nvarchar(max);RECEIVE TOP(1)    @dHandle = conversation_handle,    @Msg = message_body,    @MsgType = message_type_nameFROM MyQueue2SELECT @MsgType SELECT @MsgEND ConVERSATION @dHandle GO


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/426382.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号