Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 检查数据库中是否存在记录(来自大量数据)的有效方法(JPA/Hibernate)_Java_Sql_Sql Server_Hibernate_Jpa - Fatal编程技术网

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

Java 检查数据库中是否存在记录(来自大量数据)的有效方法(JPA/Hibernate),java,sql,sql-server,hibernate,jpa,Java,Sql,Sql Server,Hibernate,Jpa,如果数据库中存在记录,则需要检查大量数据 我们使用的是SQLServer2012/JPA/Hibernate/Spring 检查数据库中是否存在记录的有效或推荐的方法是什么 我们的实体ProductCodes具有以下字段: private Integer productCodeId // this is the PK private Integer refCode1 // ref code 1-5 has a unique constraint private Integer refCod

如果数据库中存在记录,则需要检查大量数据

我们使用的是SQLServer2012/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=?

考虑到要检查的行的大量列表,这可能是低效的,因为我们将多次调用DAOxxxx。如果文件包含要检查的1000行,则这将是1000个到DB的连接 方法2:查询数据库方法中的所有记录

我们将查询数据库中的所有记录 使用连接的refCode1-5作为键创建哈希映射 循环文件中的每一行,并根据hashmap进行验证

我们认为这在DB连接方面更有效,因为它不会创建到DB的1000个连接。但是,如果DB表有5000条记录,那么hibernate/jpa将在内存中创建5000个实体,可能会使应用程序崩溃

我们考虑采用第一种方法,因为refCode1-5有一个唯一的约束,并且将受益于隐式索引


但是,除了第一种方法之外,还有更好的方法解决这个问题吗?

尝试对100个引用代码执行批处理选择语句,而不是对每个引用代码执行一次选择

构造一个类似

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

构造select投影的方式不仅可以提供所需的wnat,还可以提供ref_代码的详细信息。在代码中,如果DB说您得到的参考代码少于您在查询中输入的代码,您可以对结果集进行计数或多线程扫描。

您可以尝试使用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语句中的行。

谢谢您的建议。我认为参考代码在。。。对我的案子不起作用。对不起,我不清楚查询部分,我已经更新了问题。我们将使用的查询将是从ProductCodes中选择*,其中refCode1=?和refCode2=?而refCode3=?和refCode4=?而refCode5=?为什么可以对refCode1=?的ProductCodes中的select*执行相同的操作?和refCode2=?而refCode3=?和refCode4=?和refCode5=?或者refCode1=?和refCode2=?而refCode3=?和refCode4=?和refCode5=?等等您只需要检查具有5个参考代码的特定组合的行;几乎所有的RDBMS都有用于此的实用程序。SQLServer还有一个名为a的东西,看起来它在这方面也会有所帮助。