У меня есть эта служба, которая выполняет некоторые бухгалтерские расчеты (генерирует годовые отчеты), что несколько сложно, поскольку мы используем формулы, которые затем анализируются и интерпретируются, поэтому сам код java является сложным, но мне удалось оптимизировать его много раз (мы используем SonarQube и codeMetrics), проблема в том, что у меня есть вызов БД внутри a для l oop, и теперь, когда я думаю об этом, это проблема (мне всегда говорили, что операции чтения и записи занимают больше времени, поэтому сокращайте их насколько это возможно) но когда вы видите это, это выглядит безобидно (я просто получаю то, что мне нужно), но недавно мы заметили проблему с производительностью, возможно, это связано с тем, что БД стала больше (хотя я почти уверен, что я провел свои тесты с большие наборы данных) или, может быть, это потому, что мы сейчас находимся в состоянии блокировки и используем VPN, что, возможно, повлияло на время ответа. у меня есть 60 дБ вызовов после окончания цикла), я использовал 2 findAll (), а затем внутри Циклы, в которых я просто использую stream.filter (...) с этим решением, мне удалось удалить около 60 ненужных вызовов в БД и увидеть увеличение времени отклика на 1-2 секунды, иногда на несколько сотен мс, мой вопрос заключается в следующем. хороший подход? или есть переменные, которые я не принимаю во внимание, которые могут быть причиной проблемы? как наличие сервера и базы данных в одной сети против наличия их в двух разных сетях, так и задержка, которая может вызвать ...
До
//1st loop
for(..) {
...
Optional<X> neededXInThisLoop = xDao.findByXYZ(x,y,z);
...
}
//2nd loop
for(..) {
...
List<Y> neededYsInThisLoop = yDao.findByX2Y2Z2(x2,y2,z2);
...
}
После
List<X> allXs = xDao.findAll();
List<Y> allYs = yDao.findAll();
//1st loop
for(..) {
...
Optional<X> neededXInThisLoop = allXs.stream.filter(...).findFirst();
...
}
//2nd loop
for(..) {
...
List<X> neededXsInThisLoop = allXs.stream.filter(...).collect(Collectors.toList());
...
}