SQL连接生命周期

时间:2009-05-27 12:47:35

标签: sql oracle jdbc memory-management master-data-management

我正在使用API​​来查询数据库服务器(在我的情况下是Oracle)来检索大量数据。 (这实际上是JDBC之上的一层。)

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

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

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

另一方面,它有一些优点:

  • 我的内存中从来没有一行数据用于结果集,因为我的查询往往会返回大约10万行,这可能是值得的。
  • 由于我的框架主要基于功能编程概念,因此我不会同时依赖内存中的多行。
  • 在数据库引擎仍然返回其他行时返回的第一行开始处理是一个很好的性能提升。

在回应甘道夫时,我补充了一些信息:

  • 我将始终必须处理整个结果集
  • 我没有进行任何行汇总

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

1 个答案:

答案 0 :(得分:1)

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

这取决于对您更重要的事情:内存或网络流量。

如果您有快速网络连接(LAN)和糟糕的客户端计算机,则从服务器逐行获取数据。

如果你在Internet上工作,那么批量提取会对你有帮助。

您可以设置预取计数或数据库图层属性,并找到中庸之道。

经验法则是:获取您可以保留的所有内容,而不会注意到它

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

  • 行生成响应时间/费率(多久Oracle生成第一行/最后一行)
  • 行投放响应时间/费率(您能多快获得第一行/最后一行)
  • 行处理响应时间/费率(您多久可以显示第一行/最后一行)

其中一个将成为瓶颈。

通常,rateresponce time是对手。

通过预取,您可以控制行传递响应时间行传输速率:更高的预取计数会提高速率但会缩短响应时间,更低的预取计数将执行对面。

选择哪一个对您更重要。

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

只选择行,以便用户在低预取模式下使用(具有高响应时间),然后切换到高预取模式。

它将在后台获取行,您也可以在后台处理它们,同时用户浏览第一行。