如果记录存在于数据库中,我们需要检查大量数据(批量数据)。
我们正在使用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(如果数据库中存在)。
//psuedo codefor each line in the file call dao. pass the refCode1-5 to query (select * from ProductCodes where refCode1=? and refCode2=? and refCode3=? and refCode4=? and refCode5=?
给定一大堆要检查的行,这可能是低效的,因为我们将调用DAO xxxx次。如果说的文件包含1000行检查,这将是与DB的1000个连接
方法2:查询数据库方法中的所有记录
我们将查询数据库中的所有记录
使用连接的refCode1-5作为键创建哈希映射
循环遍历文件中的每一行以针对哈希图进行验证
我们认为这在数据库连接方面更为有效,因为它不会创建与数据库的1000个连接。但是,如果数据库表具有例如5000条记录,则hibernate / jpa将在内存中创建5000个实体,并且可能会使应用程序崩溃
我们正在考虑采用第一种方法,因为refCode1-5具有唯一的约束,并且将从隐式索引中受益。
但是,除了第一种方法之外,还有没有更好的方法来解决此问题?
最佳答案
尝试使用诸如100 refCodes的批处理选择语句之类的方法,而不是对每个refCode进行一次选择。
构造一个像
select <what ever you want> from <table> where ref_code in (.....)
构造select投影时,不仅要给您所需的字符,还要提供ref_code的详细信息。如果数据库说您获得的refCodes少于您在查询中输入的代码数量,则可以在代码中对结果集进行计数或多线程扫描。
关于java - 检查数据库中是否有记录(来自大量数据)的有效方法(JPA/hibernate ),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23404968/