2011-12-19 124 views
5

我目前正在使用WebSocket作为向客户端传输数据的一种方法。基础设施看起来像这样。
客户端 - > Web服务器 - > Microsoft SQL数据库Microsoft SQL数据库的WebSocket侦听器

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

我想知道是否有办法自动通知套接字到Web服务器如果MSSQL数据库更新,以便它可以处理该信息。

主要问题是真的;我将如何做这项工作?我研究过一些与WebSocket一起工作的项目,如Node.JS和Socket.IO,也是Tornado。尽管我还没有找到任何有关在哪里寻找这个特定功能的线索。我发现了一些针对NodeJS的MSSQL数据库的相当不稳定的驱动程序,但不明白是否有任何方法可以向数据库创建套接字,并在将数据泵入数据库时​​立即通过套接字发送数据。我也认识到,在客户端和数据库之间建立一个套接字并不聪明,至少说安全性是明智的,因为现在这不是问题,并且SQL不是实时应用程序的方式,米绑定到它现在:)

编辑1:

感谢@tomfanning我现在知道了解决这个问题的,但是严重怀疑在性能上的提升。让我为你描绘情况。在我使用MSSQL数据库上的触发器的情况下,我想象会发生这种情况。

情况1

  1. 数据库中获取更新
  2. 扣动扳机
  3. 的CLR脚本使得对Web服务器的连接。无论是通过 由它来打开套接字和关闭每一个触发器或通过 涉及打开和关闭头(其 是无用的开销)
  4. Web服务器接收到触发和HTTP(S)请求将数据发送到客户端 。
  5. 客户端更新。

现在想象同样的场景,但然后用AJAX

情况2:

  1. 1000毫秒的超时是在客户端AJAX设置请求
  2. 客户端超时并发出AJAX请求
  3. 数据库执行一些查询并回传结果
  4. 客户端更新。

在情况1你需要一个请求和一个套接字发送/接收,在情况2你只需要一个请求。如果我将AJAX请求的超时设置为10MS,那么它对用户来说就好像它是一个像websocket一样的实时应用程序?或者情况1仍然更有效率,我只是夸大了?

在此先感谢!

+0

如果你可以通过websockets以不安全的方式访问你的数据库,我也可以。如果我可以访问你的数据库,我会把它扔给卢尔兹。安全不是一个笑话。 – Raynos

+0

@Raynos我知道安全不是一个玩笑,我一定会考虑它。但我现在只需知道是否有办法做到这一点。 –

回答

3

可能的解决方案可能是T-SQL triggers on INSERT or UPDATECLR procedure,它向您的主应用程序发送一些通知,然后通过websockets将数据输出到您的客户端。将避免需要轮询数据库。

每您的评论 - 不知道AJAX将如何帮助您特别是在这种情况下 - 因为从客户端(浏览器)驱动的技术,你的解决方案将再次投票,你想避免这我明白。 WebSockets在这里听起来很合适,因为它使您能够在不需要轮询的情况下从服务器到客户端进行真正的“推送”。

显然我在这里用非常一般的和理论的术语来谈论。

+0

我的确打算避免轮询,并且希望在我的应用程序中使用WebSockets。但想象一下触发器正在被拉动并且脚本正在执行,数据库将不得不通过套接字建立到Web服务器的连接,否则它将以链接或类似的方式打开请求。这意味着它将不得不建立一个标题,我想避免由于开销。如果我要从客户端向服务器发送AJAX请求,它将需要一个请求而不是一个请求+套接字传输的权利? –

+0

在任何可以想到让客户端代码直接与数据库服务器对话的情况下,没有任何方法是明智的。所以你总是会有某种形式的中间件,因此不管技术如何,总共有两个连接(一个在客户端和Web服务器之间,一个在Web服务器和数据库服务器之间),而不是一个。如果您从*客户端开始更新*,您总是会采用轮询模式,这将比推送模式的可扩展性差。如果你想要一个真正的推式模型,你需要从数据库端启动操作。 – tomfanning

+0

我刚才也想到,数据库中的INSERT或UPDATE触发器只会打开一个到web应用程序的连接,这可能会反过来知道需要接收推送的很多(几十,几千个)客户端通过WebSockets通知。这比成千上万的客户端周期性地发送AJAX请求来轮询更新要好得多,这反过来又会给数据库带来很大的压力。 – tomfanning