Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.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 从PostgreSql数据库逐个获取记录_Java_Hibernate_Postgresql - Fatal编程技术网

Java 从PostgreSql数据库逐个获取记录

Java 从PostgreSql数据库逐个获取记录,java,hibernate,postgresql,Java,Hibernate,Postgresql,有一个数据库包含大约300-400条记录。我可以做一个简单的查询来获取30条记录,如: SELECT * FROM table WHERE isValidated = false LIMIT 30 关于DB表的内容,请多说几句。有一个名为isValidated的列,它可以(正如您正确猜测的)接受两个值之一:true或false。查询后,应验证某些记录(isValidated=true)。每30条记录中大约有5-6条记录。相应地,在每次查询之后,我将从以前的查询中获取记录(isValidated

有一个数据库包含大约300-400条记录。我可以做一个简单的查询来获取30条记录,如:

SELECT * FROM table
WHERE isValidated = false
LIMIT 30
关于DB表的内容,请多说几句。有一个名为isValidated的列,它可以(正如您正确猜测的)接受两个值之一:true或false。查询后,应验证某些记录(isValidated=true)。每30条记录中大约有5-6条记录。相应地,在每次查询之后,我将从以前的查询中获取记录(isValidated=false)。事实上,我永远不会用这种方法结束谈判

验证过程是用Java+Hibernate完成的。我不熟悉Hibernate,所以我使用Criteria进行这个简单的查询

这类任务是否有最佳实践?添加标志字段(标记已获取的记录)的变体不合适(此数据库的工程设计过度)。 也许有机会创建一些虚拟表,在其中存储已处理的记录或类似的内容。顺便说一句,在处理完所有记录后,计划再次开始处理它们(其中一些记录可能需要验证)


提前感谢您的帮助。

我可以想象几种解决方案:

  • 把一切都存储在内存中。你只有400条记录,考虑到这个小数字,这可能是一个完美的解决方案
  • 在唯一列(例如PK)上使用order by子句(您无论如何都应该这样做),存储上次加载记录的ID,并确保下一次查询使用
    where ID>:lastId

  • 这是一种论文写作,请写得切中要害,并且可以理解。我看不出问题所在,获取所有(记住,没有数百万)需要更新的记录-更新那些需要更新的记录。如果需要,重复冲洗。我遗漏了什么?Bhavik Ambani:切中要害:如何获取特定数量的记录,而不重复已处理的记录。esej:一段时间后,可能会有数千条这样的记录,获取它们将是一个问题。@couling:PostgreSQL可以很好地处理大型数据集。您所需要做的就是告诉JDBC驱动程序不要将所有内容都加载到内存中。现在它有400条记录,下周将有数千条记录(是的,物体很重。我不太明白第二种变体。你能对此进行澄清或提供一些链接吗?我想这正是我需要的。第一页:你得到了按ID排序的30条未经验证的记录:
    select*from table where validated=false order by ID limit 30
    。你还记得最后一个ID:47。第二页:您将获得按ID排序的前30个未验证记录,其中ID大于47:
    select*from table where validated=false和ID>47 order by ID limit 30
    。您还记得最后一个ID:122。等等。@a_horse_with_no_name good point,实际上您必须做两件事1:关闭自动提交
    myConnection.setAutoCommit(false)
    和2:在运行查询之前设置语句的获取大小
    query.setFetchSize(30)