接受重复条目例外以获得性能优势?



我目前正在编程一个新闻API。为了获取新闻,我使用java从RSS提要(url)列表中解析XML,并将它们写入mysql数据库。我每隔一段时间做一次,也就是每5分钟做一次。

由于这些新闻提要通常与之前的时间抓取相同或相似,因此目前我得到了很多重复条目异常。

2021-10-08 11:29:10.296  WARN 51007 --- [   scheduling-1] o.h.engine.jdbc.spi.SqlExceptionHelper   : SQL Error: 1062, SQLState: 23000
2021-10-08 11:29:10.296 ERROR 51007 --- [   scheduling-1] o.h.engine.jdbc.spi.SqlExceptionHelper   : (conn=1850) Duplicate entry 'https://www.bild.de/regional/nuernberg/nuernberg-news/verwaltung' for key 'article.UK_o0bdhqfwhuu9g9y35687dmqhq'

我可以使用向导检查条目是否已经存在于数据库中,但是检查每一篇文章似乎性能不佳。

我还想到检索所有的文章,并在运行时构建一个Map of guid,以便告诉一个文章是否存在于数据库中,并避免大量的数据库调用。但是很快就有超过10万篇文章让我忽略了这个选项。

我很高兴听到你解决这个问题的方法,如果我对性能的假设是错误的。谢谢,提前!这是我当前的实现

for(SyndEntry syndEntry:feed.getEntries()){
Article article = customMappingSyndEntryImplToArticle(syndEntry, rssFeed);
try {
articleRepository.save(article);
} catch (DataIntegrityViolationException e) {
log.error("Duplicate Record found while saving data {}", e.getLocalizedMessage());
} catch (Exception e) {
log.error("Error while saving data {}", e.getLocalizedMessage());
}
}

你真的能分辨出两个文档是重复的吗?例如,我看到两篇相同的文章,标题不同。

因此,假设您可以说出需要检查哪些部分以进行dup,请在包含新闻文章的表中创建UNIQUE索引。

但是,有一个问题——UNIQUE的大小是有限的。特别是,任何文章的文本都有可能超过这个限制。

所以…来个"哈希"。或";digest"字符串的。把它放到唯一列中。然后,当您尝试再次插入同一篇文章时,您将得到一个错误。

好吧,这个"error"可以通过说INSERT IGNORE ...来避免。

对于这个任务,一个简单而适当的散列是函数MD5()——在SQL和大多数应用程序语言中可用。它生成一个固定长度的字符串,几乎可以保证和它正在"消化"的文本一样唯一。

最新更新