代码之家  ›  专栏  ›  技术社区  ›  Elliott

如何在java中使用大型数据库表而不出现性能问题[关闭]

  •  0
  • Elliott  · 技术社区  · 8 年前

    我们有一个词汇表,用来搜索文本文档。使用此表的java程序当前从数据库中读取该表,将其存储在内存中,然后在文档中搜索表中的各个项。出于性能原因,将表放入内存。这已经工作了很多年,但是随着时间的推移,表变得相当大,现在我们开始看到Java堆空间错误。

    有一种强力的方法来解决这个问题,那就是升级到一个更大的服务器,安装更多的内存,然后为Java堆分配更多的内存。但我想知道是否有更好的解决方案。我认为嵌入式数据库不能满足我们的需要,因为表不断更新,应用程序托管在多个站点上,这意味着维护的噩梦。但是,我不确定在这种情况下还有什么其他的技术可以帮助你。

    4 回复  |  直到 8 年前
        1
  •  2
  •   erik258    8 年前

    为了提高应用程序的性能,您将 全部的 设计时考虑到高效的数据操作 数据集。

        2
  •  0
  •   Tom    8 年前

    我会看看 http://lucene.apache.org 它应该很适合你所描述的。

        3
  •  0
  •   Gatusko    8 年前

    我对一个拥有超过一百万数据的表也有同样的问题,有一个客户想要导出所有这些数据。我的解决办法很简单我就这么做了 Question . 但是有一个小问题是有超过10万条记录进入堆空间。所以我就用 Chunks WITH NO LOCK (我知道这可能有一些不一致的数据,但我需要这样做,因为它在没有这个语句的情况下阻塞了数据库)。我希望这种方法对你有帮助。

        4
  •  0
  •   Rob    8 年前

    现在,这个表已经发展到无法将其全部加载到内存中的地步。我预计,由于每个文档中要查找的单词较多,因此每个文档的处理速度也会减慢。

    为了优化这一点,在不将整个表加载到内存中的情况下,您需要实现某种内存缓存。当您为每个单词查询数据库时,数据库服务器实际上会自动为您实现此功能;此方法的效果将取决于数据库服务器的硬件和配置,以及与您的单词查找相竞争的其他查询。

    还可以实现表中最常用部分的内存缓存。您将根据能够提供多少内存来限制缓存的大小。需要通过查询数据库来检查您查找的所有不在缓存中的单词。缓存可能使用最近使用最少的逐出策略,以便在缓存中保留最常用的单词。

    Java中有几个非常好的开放源码内存缓存实现,这将最小化实现缓存解决方案所需的代码量。