Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database Microsoft SQL数据库的WebSocket侦听器_Database_Sockets_Node.js_Websocket_Socket.io - Fatal编程技术网

Database Microsoft SQL数据库的WebSocket侦听器

Database Microsoft SQL数据库的WebSocket侦听器,database,sockets,node.js,websocket,socket.io,Database,Sockets,Node.js,Websocket,Socket.io,我目前正在从事一个项目,该项目必须使用WebSocket作为向我的客户传输数据的一种方式。基础结构如下所示。 客户端-->Web服务器-->Microsoft SQL数据库 我认为最理想的情况是: 客户端打开服务器的套接字。 服务器打开Microsoft SQL数据库的套接字。 每当数据库更新(插入了一些数据)时,DB就会将数据写入套接字。 服务器将数据写回客户端。 这可能有点乏味,也许我可以从客户端直接打开一个DB的套接字 我想知道是否有办法在MSSQL数据库更新时自动通知web服务器套接字,

我目前正在从事一个项目,该项目必须使用WebSocket作为向我的客户传输数据的一种方式。基础结构如下所示。
客户端-->Web服务器-->Microsoft SQL数据库

我认为最理想的情况是: 客户端打开服务器的套接字。 服务器打开Microsoft SQL数据库的套接字。 每当数据库更新(插入了一些数据)时,DB就会将数据写入套接字。 服务器将数据写回客户端。 这可能有点乏味,也许我可以从客户端直接打开一个DB的套接字

我想知道是否有办法在MSSQL数据库更新时自动通知web服务器套接字,以便它能够处理该信息。

主要问题是,;我将如何使这项工作?我研究了一些使用WebSocket的项目,比如Node.JS和Socket.IO,还有Tornado。虽然我还没有找到任何线索来寻找这个特定的功能。我发现了一些用于NodeJS的MSSQL数据库的相当不稳定的驱动程序,但不知道是否有任何方法可以向DB创建套接字,并在数据注入数据库时通过套接字立即发送数据

我还意识到,在客户端和数据库之间创建一个套接字(至少从安全角度来说)是不明智的,因为现在这不是一个问题,SQL不是实时应用程序的发展方向,但我现在一定要这么做:)

编辑1:

多亏了@tomfanning,我现在知道了这个问题的解决方案,但严重怀疑性能的提高。让我为你描述一下情况。在我将在MSSQL数据库上使用触发器的情况下,我想象会发生这种情况

情景1

  • 数据库得到更新
  • 扣动扳机
  • CLR脚本与Web服务器建立连接。要么通过 每次触发或通过时必须打开和关闭的插座 一种HTTP(S)请求,它涉及打开和关闭一个标头(其中 (这是无用的开销)
  • Web服务器接收触发器并将数据发送到 客户
  • 客户端将更新
  • 现在想象一下同样的场景,但是使用AJAX

    情景2:

  • 客户端为AJAX请求设置了1000毫秒的超时
  • 客户端超时并发出AJAX请求
  • 数据库执行一些查询并返回结果
  • 客户端将更新
  • 在情况1中,您需要一个请求和一个套接字发射/接收,而在情况2中,您只需要一个请求。如果我将AJAX请求的超时设置为10MS,用户会觉得它是一个像websocket一样的实时应用程序吗?或者情况1会更有效,而我只是在夸张


    提前谢谢

    可能的解决方案可能是使用一个向主应用程序发送一些通知,然后通过WebSocket将数据输出到客户端。将避免需要轮询数据库

    根据您的评论-不确定AJAX在这种情况下会如何帮助您-因为作为一种由客户端(浏览器)驱动的技术,您的解决方案将再次使用轮询,我理解您希望避免这种情况。WebSockets在这里听起来很合适,因为它使您能够在不需要轮询的情况下从服务器向客户端进行真正的“推送”


    显然,我在这里讲的是非常笼统和理论性的术语。

    如果您可以通过WebSocket以不安全的方式访问db,我也可以。如果我能访问你的数据库,我会用鼠标控制它。安全不是玩笑。@Raynos我知道安全不是玩笑,我一定会考虑的。但我只需要知道目前是否有办法做到这一点。我确实打算避免轮询,并希望在我的应用程序中使用WebSocket。但是,假设触发并执行脚本,数据库必须通过套接字与Web服务器建立连接,或者将请求作为链接或类似内容打开。这将意味着它将不得不建立一个标题,我想避免由于开销。如果我从客户机向服务器发送AJAX请求,则需要一个请求,而不是一个请求+套接字传输,对吗?在我能想到的任何场景中,让任何客户机代码直接与数据库服务器通信都是不明智的。因此,无论采用何种技术,您总是会有某种形式的中间件,因此总共有两个连接(一个在客户端和Web服务器之间,一个在Web服务器和数据库服务器之间),而不是一个。如果您从客户端启动更新,那么您将始终处于轮询模型中,而轮询模型的可伸缩性将低于推送模型。如果你想要一个真正的推送模型,你需要以某种方式从数据库端启动操作。我刚才也认为,数据库中的插入或更新触发器将只打开一个到web应用程序的连接,而web应用程序反过来可能知道需要通过WebSocket接收推送通知的大量客户机(数以万计)。这比让成千上万的客户端定期发送AJAX请求以轮询更新要好得多,这反过来会给数据库带来很大压力。我完全同意并理解这一点,但性能呢?T-SQL触发器模型会比AJAX请求轮询方法更有效吗?在我看来,是的,最有可能。最好是从数据库中发送一条消息,告诉web应用程序“我有新数据”,并让web应用程序对客户端说“这里有一些新数据”,而不是让多个客户端定期向web应用程序发出请求,询问“你有新数据吗?”,导致web应用程序(针对每个客户端请求)询问数据库“你有新的d吗