簡體   English   中英

一種檢查記錄(來自大量數據)是否存在於數據庫中的有效方法(JPA /休眠)

[英]Efficient way to check if record (from a large set of data) is existing in the Database (JPA/Hibernate)

如果記錄存在於數據庫中,我們需要檢查大量數據(批量數據)。

我們正在使用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(如果數據庫中存在)。

    //psuedo code for 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. 方法2:查詢數據庫方法中的所有記錄

    • 我們將查詢數據庫中的所有記錄
    • 創建以連接的refCode1-5作為鍵的哈希圖
    • 循環遍歷文件中的每一行以針對哈希圖進行驗證

    • 我們認為這在數據庫連接方面更為有效,因為它不會創建與數據庫的1000個連接。 但是,如果數據庫表具有例如5000條記錄,則hibernate / jpa將在內存中創建5000個實體,並且可能會使應用程序崩潰

我們正在考慮采用第一種方法,因為refCode1-5具有唯一的約束,並且將從隱式索引中受益。

但是,除了第一種方法之外,還有沒有更好的方法來解決此問題?

嘗試使用諸如100個refCodes的批處理選擇語句之類的方法,而不是對每個refCode進行一次選擇。

構造一個像

select <what ever you want> from <table> where ref_code in (.....)

構造選擇投影時,不僅要給您所需的字符,還要提供ref_code的詳細信息。 如果數據庫說您獲得的refCodes少於您在查詢中輸入的代碼數量,則可以在代碼中對結果集進行計數或多線程掃描。

您可以嘗試使用concat運算符。

select <your cols> from <your table> where concat(refCode1, refCode2, refCode3, refCode4, refCode5) IN (<set of concatenation from your file>);

我認為這將是非常有效的,並且值得嘗試一下,對行進行預排序並每次進行大量串聯操作是否會給您帶來一些好處。

我建議您在應用程序中創建一個臨時表,該文件中的所有記錄最初都是通過批處理保存的,然后再運行一個查詢,將新的臨時表和productCodes表聯接在一起,以實現所需的過濾。 這樣,您不會多次鎖定productCodes表來檢查單個行,因為SqlServer也會鎖定select語句上的行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM