2015-03-25 61 views
0

我们有一个.NET(C#)应用程序,每秒钟向Sql Server数据库执行大约10-30次插入命令。在设计应用程序时,执行插入的应用程序与Sql Server数据库一起在现场,所以网络延迟并没有真正考虑。如何通过WAN有效处理顺序数据库操作

至少网络延迟像你通过广域网或通过互联网没有考虑。

应用程序按顺序执行这些插入操作。所以,如果10-30次插入花费1秒以上,应用程序就会开始落后。我们现有的缓冲系统只能处理网络延迟中偶尔出现的“打嗝”,假设网络延迟最终会消失,应用程序将有机会赶上。

在网络等待时间持续足够高的情况下,10-30个插入总是占用一秒以上,应用程序当然变得不可用。

为了这个问题,我们假设我们没有办法减少网络延迟,或增加sql server的性能,或者类似的东西,并且10-30插入命令总是要花费1秒钟以上并导致应用程序落后于失败点。

在.NET或Sql Server本身中有没有一种很好的方式来并行执行这些命令,以利用带宽来弥补延迟?

我意识到我们可以编写我们自己的系统来处理所有这些,但它似乎已经是云数据库服务器的常见问题了。

我已经阅读了关于批处理和利用事务一次性发送更多命令的方法,但即使这样做了,但如果网络延迟足够高,它似乎最终会触发一堵墙。

我们希望应用程序能够容忍更高和更高的延迟,但也不会太落后于插入。

+0

是否有无论如何你可以在本地运行SQLExpress并使用SQL复制来为你处理syncronisation? – 2015-03-25 10:10:57

+0

不幸的是,我们实际上首先想到了这样做。我们有一个安全约束,即数据不能在本地驻留在磁盘上,而必须直接从内存中传输。 – Mike 2015-03-25 19:10:02

回答

0

有两种技术可以用来记住这个春天。

配料

将所有插入到一个SqlCommand的。

string sql = "insert into a (...) values (...);insert into a (...) values (...);....."; 

这将必须动态构建,除非值已预清理,否则应该使用参数而不是将值嵌入到sql中。这将通过网络执行所有插入操作,从而最大限度地减少延迟。 但是,如果要插入的数据跨越多个表之间具有FK关系,并且子项中的FK是新插入的父表中的IDENTITY列,那么这将不起作用。但是,一切都不会丢失。

临时表与配料加上SP

创建一组包含你要插入数据表,但不包括可能实际存在的决赛桌任何FK关系。批量插入以将数据插入登台表中,然后调用可将登台表中的数据移动到最终表中的SP,同时保留它们之间的关系。这会让你下降到两次网络往返,而不是10到30这应该有所帮助。

+0

使用SQLServer,您实际上可以将这些插入操作合并为一个语句。 '插入(...)VALUES(...),(...),(...)' – 2015-03-25 10:09:25

+0

我不知道,谢谢! – 2015-03-25 10:45:50

相关问题