3

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

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

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

我们发现插入是我们的瓶颈;大部分时间都在那里。我们投入了大量时间尝试微调表格和不雅点,但结果并不令人满意

假设我们有足够的内存,将数据插入内存而不是数据库的最佳实践是什么。目前我们正在使用每秒更新和插入的数据表 我们的一位同事建议在 feed-handler 和 WCF user-requests-handler 之间使用另一个 WCF 服务而不是数据库。WCF 中间层应该是基于 TCP 的,它将数据保存在自己的内存中。有人可能会说,提要处理程序可能会处理用户请求,而不是在 2 个进程之间有一个中间层,但我们想要分开,所以如果提要处理程序崩溃,我们仍然希望能够为用户提供当前记录

我们的时间是有限的,我们想在短时间内把一切都移到记忆中。在 2 个进程中间有一个 WCF 是一件坏事吗?我知道请求会增加一些开销,但是所有这 3 个进程(feed-handler、内存数据库(WCF)、用户请求处理程序(WCF)都将在同一台机器上,带宽不会那么多的一个问题。

请协助!

4

3 回答 3

2

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

缓存中的无效数据将基于其是否写入数据库或是否已过时,后者是最后出现的,而不是第一个出现的。

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

更新:唯一要说的就是投资一个分析器,看看你是否在被屏蔽的代码中引入了任何性能问题。此外,配置您的数据库。您提到您需要快速插入和选择 - 不幸的是,它们通常会相互权衡......

于 2010-07-05T10:22:50.160 回答
0

你用的是什么类型的数据库?MySQL 有一个存储引擎 MEMORY 似乎适合这种事情。

于 2010-07-05T10:14:30.170 回答
0

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

在内存中存储数据有在崩溃或电源故障的情况下丢失数据的风险。

于 2010-07-05T10:20:31.457 回答