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

如何在java中使用大型数据库表而不出现性能问题,java,database,large-data,Java,Database,Large Data,我们有一个词汇表,用于搜索文本文档。使用该表的java程序当前从数据库中读取该表,将其存储在内存中,然后在文档中搜索表中的各个项目。出于性能原因,该表被带入内存。这已经工作了很多年,但随着时间的推移,表已经变得相当大,现在我们开始看到Java堆空间错误 有一种蛮力方法可以解决这个问题,即升级到更大的服务器,安装更多内存,然后为Java堆分配更多内存。但我想知道是否有更好的解决办法。我认为嵌入式数据库不能满足我们的需要,因为表在不断更新,应用程序托管在多个站点上,这意味着一场维护噩梦。但是,我不确

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

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


更详细地说,目前有超过一百万个词汇项(将这些词汇项看作是短文本字符串,而不是单个单词)。应用程序从目录中读取文档,然后分析每个文档以确定文档中是否存在词汇表。如果是,我们将记录存在哪些项并将它们存储在数据库中。词汇表本身存储并维护在一个MS SQL关系数据库中,我们多年来一直在增长该数据库。由于必须为每个文档分析所有词汇表项,因此重复读取数据库是低效的。在我们的一些安装中,每天需要分析的文档数量可能相当大(每天大约10万个文档)。文档通常有2到3页长,尽管我们偶尔会看到100页的文档

我认为它应该非常适合您所描述的内容。

我认为它应该非常适合您所描述的内容。

我对一个包含超过百万数据的表有同样的问题,并且有一个客户端希望导出所有这些数据。我的解决方案很简单,我遵循了这个。但是有一个小问题,超过10万条记录进入堆空间。因此,我只使用
查询
而不使用锁(我知道这可能会有一些不一致的数据,但我需要这样做,因为它在没有此语句的情况下阻塞了DB)。我希望这种方法对你有所帮助

对于一个包含超过百万数据的表,我也遇到了同样的问题,有一个客户端希望导出所有这些数据。我的解决方案很简单,我遵循了这个。但是有一个小问题,超过10万条记录进入堆空间。因此,我只使用
查询
而不使用锁(我知道这可能会有一些不一致的数据,但我需要这样做,因为它在没有此语句的情况下阻塞了DB)。我希望这种方法对你有所帮助

当您有一个小表时,您可能实现了一种在表中的单词上循环的方法,并让每个单词在要处理的文档中查找它

现在,表已经增长到了无法将其全部加载到内存中的程度。我预计每个文档的处理速度也会减慢,因为每个文档中有更多的单词要查找

如果您改变处理方式,您将有更多机会优化此过程。特别是,要处理文档,首先要确定文档中的一组单词(例如,将每个单词添加到一组单词中)。然后,循环遍历每个文档单词并在表中查找它。最简单的实现就是对每个单词进行数据库查询

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

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

虽然只能将表中存在的字存储在缓存中,但如果缓存查找结果,可能会获得更好的性能。这将导致缓存中出现在缓存中文档中的最常见的字(每个字都有一个布尔值,指示该字是否在表中)


Java中有几种非常好的开源内存缓存实现,可以最大限度地减少实现缓存解决方案所需的代码量。

当您有一个小表时,您可能实现了一种在表中的单词上循环的方法,每个单词都在要处理的文档中查找

现在,表已经增长到了无法将其全部加载到内存中的程度。我预计每个文档的处理速度也会减慢,因为每个文档中有更多的单词要查找

如果您改变处理方式,您将有更多机会优化此过程。特别是,要处理文档,首先要确定文档中的一组单词(例如,将每个单词添加到一组单词中)。然后,循环遍历每个文档单词并在表中查找它。最简单的实现就是对每个单词进行数据库查询

要对此进行优化,在不将整个表加载到内存中的情况下,您需要实现