2009-05-27 79 views
2

我正在研究一个API来查询数据库服务器(在我的情况下是Oracle)来检索大量的数据。 (这实际上是一个位于JDBC之上的图层。)SQL连接生存期

我创建的API试图尽可能限制将每个查询信息加载到内存中。我的意思是我更喜欢迭代结果集并逐个处理返回的行,而不是在内存中加载每行并稍后处理它们。

但我想知道如果这是最好的做法,因为它有一些问题:

  • 在整个处理过程中的结果集保存,如果处理是,只要检索数据,这意味着我的结果集将打开两倍长
  • 在我的处理循环中执行另一个查询意味着在我已经使用另一个结果集的同时打开另一个结果集,但同时开始打开太多结果集可能不是一个好主意。

另一方面,它具有一定的优势:

  • 我从来没有在内存中的数据结果集的多个行,因为我的查询往往返回100k左右的行,它可能值得。
  • 由于我的框架主要基于函数式编程概念,所以我从不依赖同时存在于内存中的多行。
  • 在数据库引擎仍然返回其他行时返回的第一行开始处理是一个很好的性能提升。

在回答甘道夫,我添加了一些更多的信息:

  • 我总是要处理整个结果集
  • 我没有做的任何行的聚集

我正在与主数据管理应用程序集成并检索数据以验证它们或使用多种不同格式(到ERP,到Web平台等)导出它们。

+0

“SQL server(Oracle)”是什么意思? – Andomar 2009-05-27 13:24:19

+0

试图澄清,对于混淆感到抱歉 – 2009-05-27 13:43:21

+0

衡量我们真正需要了解更多关于如何使用查询结果的好处。你会一直处理整个结果集吗?您是将每个结果的值相加,还是可以在数据库中完成的任何其他聚合工作? – Gandalf 2009-05-27 17:34:12

回答

1

没有普遍的答案。我亲自实施了两次解决方案。

这取决于什么对你更重要:内存或网络流量。

如果您的网络连接速度很快(LAN),而且客户端机器较差,请从服务器中逐行读取数据。

如果你在Internet上工作,那么批量获取将帮助你。

您可以设置预取计数或数据库图层属性并找到一个中值。

凭经验是:获取的一切,你可以保持不知不觉

,如果您需要更详细的分析,也有涉及六个因素:

  • 排辈性反应的时间/速度(多快Oracle生成第一行/最后一行)
  • 行传递响应时间/速率(多久可以得到f IRST行/最后一行)
  • 行处理响应时间/速度(你们多久才可以显示第一行/最后一行)

他们中的一个将成为瓶颈。

通常,rateresponce time是拮抗剂。

随着预取,你可以控制行交付响应时间行分娩率:高预取数将增加速度,但缩短响应时间,降低预取数却反其道而行之。

选择哪一个对您更重要。

您还可以执行以下操作:为获取和处理创建单独的线程。

只需选择多行以保持用户在低预取模式(高响应时间)下的乐趣,然后切换到高预取模式。

它将获取背景中的行,并且您可以在后台处理它们,同时用户浏览第一行。

+0

根据你的经验法则,我明白如果我有无限的内存量,我应该一次获取每条记录。但是我的这个选择的问题是提取100k记录需要时间,并且会延迟这些记录的处理的开始。由于我的处理过程实际上发生在每次记录抓取之间,所以一个接一个地抓取它们允许我开始处理,因为抓取记录并限制CPU使用。 – 2009-05-29 09:49:23

+0

谢谢你提出分析。我将分析这些价值观并尝试做出最佳决策。感谢您的建议,但我的应用程序不是面向用户的bue数据导向的,我需要尽可能快地导出尽可能多的数据。 – 2009-05-29 15:42:11