我目前正在编写一个新闻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'我可以使用guid检查这些条目是否已经存在于数据库中,但是检查每个单独的项目在性能方面似乎很糟糕。
我还考虑在运行时检索所有文章并构建一个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());
}
}发布于 2021-10-10 01:37:54
你真的能分辨出两个文档是否是重复的?例如,我看过两篇相同的文章,标题不同。
因此,假设您可以告诉dup需要检查哪些部分,那么在包含新闻文章的表中创建一个UNIQUE索引。
但是,有一个问题-- UNIQUE的大小是有限的。特别是,任何文章的文本都可能超过该限制。
所以..。获取字符串的"hash“或"digest”。将其放在唯一列中。然后,当您尝试再次插入相同的文章时,您将得到一个错误。
好吧,这个“错误”可以通过说INSERT IGNORE ...来避免。
这个任务的一个简单而充分的散列是函数MD5() --它在SQL和大多数应用程序语言中都可用。它生成一个固定长度的字符串,几乎可以保证和它正在“消化”的文本一样唯一。
https://stackoverflow.com/questions/69494087
复制相似问题