Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.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 在循环中优化更新请求_Java_Mysql_Sql_Hibernate_Jpa - Fatal编程技术网

Java 在循环中优化更新请求

Java 在循环中优化更新请求,java,mysql,sql,hibernate,jpa,Java,Mysql,Sql,Hibernate,Jpa,我有一个简单的用例,但它确实没有优化,我想知道它是否可以 假设我有一个简单的实体,它包含一个ID和一个名为price的变量(该实体称为Product) 我使用的是Hibernate和JPA,每小时我都想更新我的产品价格,下面是伪代码: List<Product> products = Product.retrieveAll(); for (Product p : products) { p.price = makeSomeComplexComputationsToGetNex

我有一个简单的用例,但它确实没有优化,我想知道它是否可以

假设我有一个简单的实体,它包含一个
ID
和一个名为
price
的变量(该实体称为
Product

我使用的是
Hibernate
JPA
,每小时我都想更新我的产品价格,下面是伪代码:

List<Product> products = Product.retrieveAll();
for (Product p : products) {
    p.price = makeSomeComplexComputationsToGetNextPrice();
    p.save();   // Updates the entity in the DB
}
List products=Product.retrieveAll();
对于(产品p:产品){
p、 price=makeSomeComplexComputationsToGetNextPrice();
p、 save();//更新数据库中的实体
}

这段代码非常简单。
makeSomeComplexComputationsToGetNextPrice(),使用CPU进行一些计算,而且速度很快

当我有100个产品时,一切正常(代码发出101个sql请求),但假设我有10000个产品,代码发出100001个sql请求,这需要几秒钟

这个用例是我真实用例的简化版本,但问题在于:当我有太多的产品时,它需要太多的时间来执行(因为有大量的查询)

使用
hibernate
JPA
,有没有办法优化这样的用例?(执行此代码所需时间应少于1秒,而且由于所有查询,执行时间远远超过1秒)


非常感谢您的帮助

使用批处理怎么样?我想这就是典型的做法


最简单的优化方法是使用批量传输。尝试计算大小为N的批量,然后同时存储全部N个产品。您不必为每个存储(打开连接、存储、刷新、关闭连接)付出努力,而是只为每个批量执行一次

更容易的是,当您选择整个产品数量作为您的体积时,有效地使其成为load computeeach store算法

否则,选择完美的体积大小可能会很棘手,因为它取决于很多参数,例如对象大小、数据库及其硬件参数等等,但通常只需尝试不同的值并测量时间,就可以发现一个好的值


其他方法可能包括并行(似乎不合适,因为IO是瓶颈)或调整DB。

正如@EricStein和@LastFree昵称指出的,如果我们在
p.save()中讨论插入命令,那么使用批量插入是一种解决方案

但是如果
makeSomeComplexComputationsToGetNextPrice()
正在对一些SELECT请求进行DB调用,然后首先查询这些复杂计算所需的所有数据,然后对其进行操作(再次使用批处理技术进行插入)。

makeSomeComplexComputationsToGetNextPrice
是为了使用数据库访问?为什么不先尝试从DB检索数据,然后查询/操作/计算这些数据?@Christian这就是OP目前正在做的。@Christian这就是我正在做的:检索产品,修改变量,然后通过sqlThank更新它们。谢谢,但是如何使用Hibernate和JPA同时存储整个B产品?你必须看看你的表设计,阅读一些手册或谷歌你的DB+批量传输。对不起,我不是Hibernate或JPA专家。通常,如果将存储方法精确地设置为一个打开连接和一个关闭连接,则会带来很多性能。