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专家。通常,如果将存储方法精确地设置为一个打开连接和一个关闭连接,则会带来很多性能。