java - 检查数据库中是否存在记录(来自大量数据)的有效方法(JPA/Hibernate)

标签 java sql sql-server hibernate jpa

我们有大量数据(批量数据),需要检查数据库中是否存在该记录。

我们使用的是 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. 方法 1:通常方法。

    • 循环遍历每一行并调用 DAO 来查询 refCode1-5(如果数据库中存在)。

    //伪代码 对于文件中的每一行 叫道。传入refCode1-5进行查询 (从 ProductCodes 中选择 *,其中 refCode1=? 和 refCode2=? 和 refCode3=? 和 refCode4=? 和 refCode5=?

    • 给定大量要检查的行列表,这可能效率较低,因为我们将调用 DAO xxxx 次。如果文件包含 1000 行要检查的内容,则这将是 1000 个与数据库的连接
  2. 方式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/

相关文章:

sql - Rails 3 中的 ActiveRecord 生成的 SQL

php - 关键字 GO 在 PHP 中抛出错误

java - 日历日期不同

java - 我需要为此使用线程吗?

mysql - 当 View 中的数据发生变化时触发查询

mysql - SQL 仅选择列上具有最大值的行

.net - 基于 Microsoft 的现代标准技术堆栈是什么样的?

sql-server - SQL Server 功能等同于 PostgreSQL "in"

java - 异步任务 : pass two or more values from doInBackground to onPostExecute

java - JTable - 更新 JTable