我们有大量数据(批量数据),需要检查数据库中是否存在该记录。
我们使用的是 SQL Server2012/JPA/Hibernate/Spring。
检查数据库中是否存在记录的有效或推荐方法是什么?
我们的实体 ProductCodes 具有以下字段:
private Integer productCodeId // this is the PK
private Integer refCode1 // ref code 1-5 has a unique constraint
private Integer refCode2
private Integer refCode3
private Integer refCode4
private Integer refCode5
... other fields
我们正在创建的服务将获得一个文件,其中每一行都是 refCode1-5 的组合。
该服务的任务是检查并报告文件中已存在于数据库中的所有行。
我们正在考虑通过两种方式解决这个问题。
方法 1:通常方法。
- 循环遍历每一行并调用 DAO 来查询 refCode1-5(如果数据库中存在)。
//伪代码 对于文件中的每一行 叫道。传入refCode1-5进行查询 (从 ProductCodes 中选择 *,其中 refCode1=? 和 refCode2=? 和 refCode3=? 和 refCode4=? 和 refCode5=?
- 给定大量要检查的行列表,这可能效率较低,因为我们将调用 DAO xxxx 次。如果文件包含 1000 行要检查的内容,则这将是 1000 个与数据库的连接
方式2:查询DB中所有记录的方式
- 我们将查询数据库中的所有记录
- 使用连接的 refCode1-5 作为键创建 HashMap
循环遍历文件中的每一行,根据 HashMap 进行验证
我们认为这在数据库连接方面更有效,因为它不会创建 1000 个与数据库的连接。但是,如果数据库表有 5000 条记录,那么 hibernate/jpa 将在内存中创建 5000 个实体,并且可能会导致应用程序崩溃
我们正在考虑采用第一种方法,因为 refCode1-5 具有唯一约束并且将从隐式索引中受益。
但是除了第一种方法之外,还有更好的方法来解决这个问题吗?
最佳答案
尝试使用批量选择语句来选择 100 个 refCode,而不是为每个 refCode 执行一次选择。
构建一个类似的查询
select <what ever you want> from <table> where ref_code in (.....)
构建选择投影的方式不仅可以提供您想要的内容,还可以提供 ref_code 的详细信息。在代码中,如果数据库表示您获得的 refCode 少于您在查询中输入的编码数量,您可以对结果集进行计数或多线程扫描。
关于java - 检查数据库中是否存在记录(来自大量数据)的有效方法(JPA/Hibernate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23404968/