[英]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:通常的方法。
//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=?
方法2:查詢數據庫方法中的所有記錄
循環遍歷文件中的每一行以針對哈希圖進行驗證
我們認為這在數據庫連接方面更為有效,因為它不會創建與數據庫的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.