【问题标题】:Querying Firebird database results in Java Heap Space error查询 Firebird 数据库导致 Java Heap Space 错误
【发布时间】:2018-09-07 17:49:03
【问题描述】:

我在使用 Firebird 时遇到了一些问题。一些 SQL 查询收到错误“Java Heap Space”。

我已经修改了所有查询并且似乎是正确的。但是,在做了一些测试之后,我注意到只有当 SQL 查询没有返回行的限制时才会发生错误。 如果我使用SELECT FIRST(10) field1, field2 from table 运行查询,它会从db 返回结果,如果没有FIRST(),则会发生错误。

安装 Firebird 的原始服务器内存有限,所以我只是在我的个人计算机上安装了 Firebird,恢复了备份并进行了测试。我当前的计算机有很多内存和 CPU 来运行这个简单的查询并且会出现同样的问题。

我的 Firebird 版本是 2.5。我在 Firebird 官方文档中进行了搜索,但没有发现任何有用的信息。任何人都知道可能导致此错误的原因是什么?

以下是测试期间的错误打印和我的计算机任务管理器。

[

【问题讨论】:

  • 你为什么还在使用 Firebird 2.5.0?最新的 2.5 是 2.5.8。今年发布2.5.8,8年前发布2.5.0。
  • 如果不使用first,您的查询将检索多少行?
  • 我正在使用 2.5 版本来准确复制在原始服务器上运行的环境。也许我应该将 Firebird 更新到最新版本,看看它是否能解决问题?
  • "你的查询将检索多少行而不使用 first" 我不知道。它在返回所有行之前崩溃=/但我认为它应该接近 150 ~ 250 行。 (至少是最终用户在报告问题时告诉我的)
  • 您总是可以通过count(*) 实际知道有多少行,因为我不希望 250 行会导致这样的错误(除非此应用程序的内存配置非常紧张,或者它有列有非常大的斑点)。升级您的 Firebird 版本对此没有影响(否则我会将其包含在我的答案中)。您的 Firebird 版本非常旧,存在已知的安全漏洞。它应该在几年前就升级了。

标签: java firebird dbeaver jaybird


【解决方案1】:

此问题与 Firebird 服务器本身的内存使用无关。您的查询工具是一个 Java 应用程序(它看起来像 DBeaver,但也可能是一个不同的基于 Eclipse 的应用程序),检索所有行会消耗太多内存。当 Java 无法分配足够的内存时,这会导致 OutOfMemoryError 带有消息 "Java heap space"

您要么需要将该应用程序配置为使用更多内存,要么确定它是否可以检索页面中的行而不是获取所有行。当以自动提交模式执行查询时,Jaybird(Firebird JDBC 驱动程序)本身会检索所有行,因此您可能需要在事务中执行它。

或者,正如您已经发现的那样:不要查询所有行。

【讨论】:

  • retrieve all rows when the query is executed in auto-commit mode 真的需要仓促,而不是让用户滚动到最后然后提交关闭吗?此外,即使客户端应用程序并不真正需要字段内容,JayBird 是否会自动获取 BLOB 内容?不知道 DBeaver,但 IBExpert 不会在常规网格中显示 BLOB 内容,如果用户请求,它会在特殊的 BLOB 编辑器窗口中显示
  • @Arioch'The 是的,我似乎找到了问题所在。这些 Blob 字段充满了 BMP 图像和不必要的大图像。在用你的小技巧调试了一段时间后,我找到了它。在“EMPRESA”表中,Blob 字段用于以高分辨率存储公司徽标(为什么?!)。在这种情况下,图像有 15mb 大小,这就是 DBeaver 和 Delphi 应用程序崩溃的原因。我刚刚提取、压缩并重新插入图像,似乎已经解决了。谢谢! :)
  • 在 BLOB 中存储数据是有意义的——它提供了更轻松的复制(部署其他实例、备份等)。有些人甚至将程序保存在 BLOB 中,以便他们可以轻松地将更新部署到所有客户端工作场所
  • @Arioch'是的,将文件存储到数据库中是有一定意义的。但是,在这种特定情况下,被滥用了......因为这些图像仅在某些报告中用作徽标。所以,我认为开发人员应该在将文件插入数据库之前压缩文件。使用 15mb 的文件作为报告的徽标似乎是个坏主意。构造 sql 查询,它为每一行检索这些图像(15mb)......在这种情况下,查询应该检索 98 行,并且对于每一行,图像,所以,它消耗 1.47gb记忆...
  • @WilliamGustavoMarqueti 保留高分辨率徽标是有意义的——因为报告的视觉模板可能会改变,或者报告的种类(比如从表格视图到每个条目一个漂亮的 A4 页面) .因此,从高分辨率开始可能是有意义的。然后,当然,在报告创建应用程序(如果服务器 HDD 或客户端网络的瓶颈不受限制)或数据库缓存本身中,必须相应地缩小图片。或者,如果从来没有,应用程序必须在插入时缩小规模。然而,这正在从“修复错误”发展为“修复应用程序”领域:-D
猜你喜欢
  • 2013-06-06
  • 1970-01-01
  • 1970-01-01
  • 2013-12-20
  • 2010-09-07
  • 1970-01-01
相关资源
最近更新 更多