java - 如何在java中使用大型数据库表而不会遇到性能问题

标签 java database large-data

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

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

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

最佳答案

为了提高应用程序的性能,您从数据库中取出所有数据,并将其放入设计时考虑到高效数据操作的数据库中。到您的应用程序的内存中。这对于小型数据集来说效果很好,但随着这些数据集的增长,您最终将耗尽应用程序中处理整个数据集的资源。

解决方案是使用适合您的用例的数据库,或至少是数据层。让您的数据层承担繁重的工作,而不是将数据集复制到您的应用程序中。数据库是令人难以置信的,它们处理大量数据的能力常常被低估。您并不总能免费获得极快的性能(您可能必须认真考虑索引和模型),但很少有 Java 代码能够提取整个数据集并更有效地处理它的用例比数据库可以。

您没有过多说明您正在使用哪些数据库技术,但大多数关系数据库都会提供许多有用的全文搜索工具。我见过设计良好的关系数据库非常有效地执行文本搜索。但是,如果您受到数据库技术的限制,或者您的表确实太大,以至于关系数据库文本搜索不可行,那么您应该将数据放入可搜索的缓存中,例如 Elasticsearch 。如果您有效地对数据进行建模和索引,您就可以构建一个性能非常高且 cocoa 靠扩展的文本搜索平台。 Tom 对 lucene 的建议是另一个很好的建议。有很多云技术也可以帮助解决此类问题:如果您喜欢 AWS,您会想到 S3 + Athena。

关于java - 如何在java中使用大型数据库表而不会遇到性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51770763/

相关文章:

jquery - 大数据集的过滤下拉列表

mysql - 将大型 MyISAM 表转换为 InnoDB

java - 从 Activity 移动到上一个 fragment

java - 在 Linux 操作系统上使用正确的 JDK 或更改 Netbeans 中的默认值

java - TCP 上的多个 channel ?

javascript - 无法使用sequelize和mysql根据包含的模型属性过滤数据

PHP远程MySQL数据库连接非常慢

java - 无法使用 gmail-smtp 和 javamail 发送电子邮件?

ruby-on-rails - 使用 Heroku Web 界面,如何将 PG 数据库从 Heroku 导出为 CSV 文件?

list - ocaml超大数据结构建议