我们有一个应用程序,可以获取实时数据并将其插入数据库。它每天在线4.5个小时。我们将数据插入17个表中的第二秒。用户随时可以查询任何表格的最新第二个数据,并在历史记录中查询一些记录...

处理提要和插入是使用C#控制台应用程序进行的...

处理用户请求是通过WCF服务完成的...

我们发现插入是我们的瓶颈。大多数时间都在那里。我们花了很多时间试图挑战桌子和犹豫不决,但结果并不令人满意

假设我们有足够的内存,那么将数据插入内存而不是拥有数据库的最佳实践是什么。当前,我们正在使用每秒更新和插入我们的同事建议的DataTables,建议另一种WCF服务,而不是在供稿手和WCF用户重新征用手柄之间的数据库。 WCF中层应该是基于TCP的,它将数据保持在其自身的内存中。有人可能会说,饲料处理程序可能会处理用户要求,而不是在2个过程之间具有中间层,但是我们想分开事物,因此,如果馈送手机崩溃,我们仍希望能够为用户提供当前记录

我们的时间有限,我们希望在短时间内将所有内容移至内存。在两个过程中间有一个WCF是一件坏事吗?我知道这些请求添加了一些开销,但是所有这三个进程(feed Handler,在内存数据库(WCF)中,用户重复处理程序(WCF)都将在同一台计算机上,并且带宽不会那么多问题。

请协助!

有帮助吗?

解决方案

我将考虑创建数据的缓存(以便您还可以减少数据库选择),并在将数据写入数据库后将数据无效。这样,您可以批量拨打调用以进行较大的插入而不是许多较小的插入物,但是将数据保存在内存中,以便读者可以阅读它。实际上,如果您知道数据何时陈旧,则可以避免完全读取数据库并将其用作备份商店 - 这样,数据库性能只会影响您的缓存的大小。

缓存中的数据无效的数据将基于其写入数据库还是陈旧的陈旧的基础 最后的, ,不是先。

缓存层不需要复杂,但是应该将其多线程托管数据并将其保存在后台。该层将位于WCF服务,连接介质的后面,并且应改进WCF服务,以包含Console App +批处理想法的逻辑。然后,控制台应用程序可以连接到WCF并向其投掷结果。

更新: 唯一要说的是投资于探查者,以查看您是否正在介绍被掩盖的代码中的任何性能问题。另外,配置您的数据库。您提到您需要快速插入和选择 - 不幸的是,它们通常相互折衷...

其他提示

您正在使用哪种数据库? MySQL具有存储引擎内存,似乎适合这种事情。

您是否使用DataAdapter使用DataTable?如果是这样,我建议您将它们完全放下。使用DBCommand直接插入您的记录。当用户请求报告时,请使用DataReader读取数据,或使用DataTable.load(IDATAREADER)填充数据表对象。

记忆中的故事数据在发生崩溃或电源故障时会丢失数据的风险。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top