.net 如何高效地处理WAN上的顺序数据库操作

.net 如何高效地处理WAN上的顺序数据库操作,.net,database,latency,.net,Database,Latency,我们有一个.NET(C#)应用程序,它每秒向Sql Server数据库执行大约10-30个insert命令。在设计应用程序时,执行插入的应用程序位于Sql Server数据库的现场,因此没有真正考虑网络延迟 至少网络延迟,比如你通过广域网或互联网的延迟,没有被考虑在内 应用程序按顺序执行这些插入。因此,如果10-30次插入时间超过1秒,应用程序就会开始落后。我们现有的缓冲系统只处理网络延迟中偶尔出现的“打嗝”,假设网络延迟最终将趋于平衡,应用程序将有机会迎头赶上 如果网络延迟一直很高,以至于10

我们有一个.NET(C#)应用程序,它每秒向Sql Server数据库执行大约10-30个insert命令。在设计应用程序时,执行插入的应用程序位于Sql Server数据库的现场,因此没有真正考虑网络延迟

至少网络延迟,比如你通过广域网或互联网的延迟,没有被考虑在内

应用程序按顺序执行这些插入。因此,如果10-30次插入时间超过1秒,应用程序就会开始落后。我们现有的缓冲系统只处理网络延迟中偶尔出现的“打嗝”,假设网络延迟最终将趋于平衡,应用程序将有机会迎头赶上

如果网络延迟一直很高,以至于10-30次插入总是超过一秒钟,那么应用程序当然会变得不可用

对于这个问题,我们假设我们无法降低网络延迟、提高sql server性能或诸如此类的事情,并且10-30 insert命令总是会占用1秒以上的时间,导致应用程序落后到故障点

在.NET或Sql Server本身上有没有一种好方法可以并行执行这些命令,从而利用带宽来帮助弥补延迟

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

我读过关于批处理和利用事务通过管道一次发送更多命令的文章,但即使这样做,如果网络延迟足够高,它似乎最终也会遇到麻烦


我们希望应用程序能够承受越来越高的延迟,但也不要在插入方面落后太多。

有两种技术可以让您记住spring

配料

将所有插入内容放在一个SQLCommand中

string sql = "insert into a (...) values (...);insert into a (...) values (...);.....";
这必须是动态构建的,除非预先清理了值,否则应该使用参数,而不是将值嵌入到sql中。这将通过网络在一次行程中完成所有插入,从而最大限度地减少延迟。 但是,如果要插入的数据跨越多个表,这些表之间具有FK关系,并且子表中的FK是新插入的父表中的标识列,则这将不起作用。然而,一切都没有失去

带有批处理和SP的暂存表


创建一组表,其中包含必须插入的数据,但不包括最终表中实际存在的任何FK关系。Batch up insert可将数据插入暂存表,然后调用SP,SP可将数据从暂存表移动到最终表中,同时保留它们之间的关系。这将使您减少到两次网络往返,而不是10到30次,这应该会有所帮助。

使用SQLServer,您实际上可以将这些插入合并到一条语句中<代码>插入到(…)值(…),(…),(…),(…)是否可以在本地运行SQLExpress并使用SQL复制为您处理同步?不幸的是,没有,我们一开始确实考虑过这样做。我们有一个安全约束,即数据不能本地驻留在磁盘上,必须直接从内存传输。