长时间打开数据库连接和SQL连接查询内存

时间:2018-04-11 08:51:57

标签: mysql oracle jdbc

我目前正在开发一个java应用程序,它在后台线程中执行以下操作。

  1. 打开数据库连接
  2. 选择一些行(100000多行)
  3. 通过调用ResultSet.next()执行一个长时间运行的任务,其中一些缓冲区大小由resultSet.setFetchSize()
  4. 定义
  5. 最后完成所有事情后关闭连接
  6. 如果查询进行了一些排序或加入,它将创建一个临时表,并将有一些额外的内存使用量。我的问题是,如果我的数据库连接被打开了很长时间(让我们说几个小时)并逐个批量获取,是否会因内存使用而导致数据库出现性能问题? (如果数据库也被其他线程同时使用。)或者数据库是为了有效地处理这些事情而设计的?

    (在MySQL和Oracle的上下文中)

2 个答案:

答案 0 :(得分:1)

从Oracle的角度来看,打开一个光标并定期从中获取它并不会产生那么大的影响,如果它保持打开状态......除非光标正在查询的基础数据发生变化查询首先开始。

如果是这样,Oracle数据库现在必须做额外的工作来查找查询开始时的数据(因为读取一致性!),所以现在需要查询数据块(在磁盘上或来自缓冲区缓存),如果数据已更改,则撤消表空间。

如果撤消表空间的大小不合适并且数据已经更改,您可能会发现光标提取失败并显示" ORA-01555:快照太旧"异常。

就内存使用而言,游标不会打开结果集并将其存储在某个地方;它只是一组数据库的指令,说明如何获取在执行提取时执行的下一行。存储在内存中的是那组指令,与它可以返回的数据量相比,它相对较小!

答案 1 :(得分:1)

这种机制似乎不太好。

尽管mysql(innodb引擎)和oracle都为select提供了一致的读取,

做这么长的选择可能会导致因构建cr阻塞和其他工作导致性能下降,

甚至在oracle中的ora-01555。

我认为你应该首先查询/导出所有数据,

然后逐个处理实际业务。

最后,首先查询所有数据不会减少内存使用量,

但减少内存和临时排序段/文件使用的连续时间。

或者你应该考虑将整个工作分成小块,

这样更好。