【问题标题】:How to ensure that updating to database on certain interval如何确保以一定的时间间隔更新到数据库
【发布时间】:2021-03-11 06:02:39
【问题描述】:

我正在使用 Spring java8 应用程序 我有一个异步生成标签(pdf生成)的函数。 它包含一个循环,通常它会运行超过 1000 个,它会生成超过 1000 个 pdf 标签。 在每个循环结束后,我们需要更新数据库,以便我们只保存状态,即最初它保存 numberOfgeneratedCount=0 ,在每个标签之后我们只是增加变量并更新表。 不必在每个循环结束时将这个递增的计数保存到 db,我们需要的是在固定的时间间隔内只需要更新数据库以减少数据库插入的负载。 目前我的代码是这样的

// Label is a database model class labeldb is variable of that 
//commonDao.saveLabelToDb function to save Label object

int numberOfgeneratedCount =0;
labeldb.setProcessedOrderCount(numberOfgeneratedCount);
commonDao.saveLabelToDb(labeldb);

for(Order order: orders){
  generated = true;
  try{
        // pdf generation code
     }catch Exception e{
        // catch block here
        generated = false;
     }

     if(generated){
          numberOfgeneratedCount++;
          deliveryLabeldb.setProcessedOrderCount(numberOfgeneratedCount);
          commonDao.saveLabelToDb(labeldb );
     }
}

为了提高性能,我们只需每隔 10 秒更新一次数据库。任何帮助将不胜感激

【问题讨论】:

  • 为什么在for循环完成后不更新db而不是for循环的每次迭代..
  • @ShekharKhairnar 这是一个耗时的过程,所以FE需要知道pdf生成的当前状态,同时按下下载按钮我们会显示状态,直到文件生成过程完成,它就像 numberOfgeneratedCount/total orders
  • 将此逻辑移动到服务器(存储过程)。 为了提高性能,我们只需每隔 10 秒更新一次数据库。 创建计划的事件过程。
  • @Akina 我只需要实现这个低谷代码,因为。我们可能要运行多个线程来生成不同类型的标签,移动这个数据库很困难
  • @Faseela 好的。一种可能的解决方案是在生成一定数量的 pdf 后访问数据库,例如 10 或根据您的需要,因为您可以维护一个计数器并在 db hit 重置计数器后。

标签: mysql spring hibernate java-8


【解决方案1】:

我已经使用以下代码完成了此操作,我不确定这是否是一个好的解决方案,请有人使用一些内置函数来改进它

int numberOfgeneratedCount =0;
labeldb.setProcessedOrderCount(numberOfgeneratedCount);
commonDao.saveLabelToDb(labeldb);
int nowSecs =LocalTime.now().toSecondOfDay();
int lastSecs = nowSecs;

for(Order order: orders){
  nowSecs = LocalTime.now().toSecondOfDay();
  generated = true;
  try{
        // pdf generation code
     }catch Exception e{
        // catch block here
        generated = false;
     }

     if(generated){
          numberOfgeneratedCount++;
          deliveryLabeldb.setProcessedOrderCount(numberOfgeneratedCount);
          if(nowSecs-lastSecs > 10){
                lastSecs=nowSecs;
                commonDao.saveLabelToDb(labeldb );
             }
        
     }
}

【讨论】:

  • 我想,有了这个,你永远无法保存语句..
  • 对不起,我忘了在循环的请求中添加更新 nowSec 的声明 nowSec =LocalTime.now().toSecondOfDay();
猜你喜欢
  • 1970-01-01
  • 2018-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多