Улучшить производительность метода

Мне нужно улучшить производительность моего кода. У меня есть следующий код:

public List<ArticoliDett> settaArticoliPreSalvataggio(Iterator iteratore){
        try{
            List<ArticoliDett> listaArticoliPre=new ArrayList<ArticoliDett>();
            while(iteratore.hasNext()){
                Object obj = iteratore.next();
                if (obj instanceof FatturaArticoli){
                    FatturaArticoli articoloF = (FatturaArticoli) obj;
                    if (articoloF.getIsLavoro()!=null && articoloF.getIsLavoro())
                        continue;
                    if (!articoloF.getCodiceArticolo().equalsIgnoreCase("-")  
                            && !articoloF.getCodiceArticolo().equals(WFConst.COD_RITENUTA_ACCONTO)
                            && !articoloF.getCodiceArticolo().equals(WFConst.CODICE_IBAN)){
                        ArticoliDett articoloPre = modelManager.getArticoliManager().estraiArticoloCompleto(Integer.parseInt(articoloF.getCodiceArticolo()), false);
                        if (articoloPre!=null){
                            if (articoloF.getNomeArticolo().contains("(Articolo Gratuito)"))
                                articoloPre.setNomeArticolo(articoloPre.getNomeArticolo()+" (Articolo Gratuito)");
                            listaArticoliPre.add(articoloPre);
                        }
                        else{
                            return null;
                        }
                    }

                }
            }
            return listaArticoliPre;
        }catch(Exception e){
            log.logStackTrace(e);
            return null;
        }
    }

Для каждого элемента внутри Iterator мне нужно сделать запрос в моей базе данных. Строка такая:

modelManager.getArticoliManager().estraiArticoloCompleto(Integer.parseInt(articoloF.getCodiceArticolo()), false);

Я вижу, что эта очередь замедляется. Это метод estraiArticoloCompleto, который получает Article из базы данных:

public ArticoliDett estraiArticoloCompleto(int idArticolo, Boolean estraiArticoloPerFornitore){
        ArticoliDett articolo = new ArticoliDett(); 
        String query = "SELECT CODARTIcOLO,nomearticolo,soglia,prezzomedio,"
                + "quantita,prezzoattuale,prezzorivenditore, "
                + "prezzoingrosso,iva,quantitacartone,quantitaPedane, " 
                + "IN_SCHEDA_LAVORO, IS_LAVORO "
                + "FROM VISTAARTICOLI "
                + "WHERE codarticolo=?";
        try {
            PreparedStatement stmt = db.prepareStatement(query);     
            stmt.setInt(1, idArticolo);
            ResultSet rs = stmt.executeQuery();   
            while(rs.next()) {   
                int nColumn = 1;
                articolo.setCodArticolo(rs.getInt(nColumn++));
                articolo.setNomeArticolo(rs.getString(nColumn++));
                articolo.setSoglia(rs.getInt(nColumn++));
                articolo.setPrezzoMedioVendita(rs.getDouble(nColumn++));
                Articoli artGiacenza = new Articoli();
                artGiacenza.setCodArticolo(articolo.getCodArticolo());
                artGiacenza.setQuantita(rs.getInt(nColumn++));
                artGiacenza.setPrezzoAttuale(rs.getDouble(nColumn++));
                artGiacenza.setPrezzoRivenditore(rs.getDouble(nColumn++));
                artGiacenza.setPrezzoIngrosso(rs.getDouble(nColumn++));
                artGiacenza.setIva(rs.getInt(nColumn++));
                artGiacenza.setPezziCartone(rs.getInt(nColumn++));
                artGiacenza.setPezziPedana(rs.getInt(nColumn++));
                artGiacenza.setNomeArticolo(articolo.getNomeArticolo());
                artGiacenza.setInSchedaLavoro(rs.getInt(nColumn++) == 1 ? true : false);
                artGiacenza.setIsLavoro(rs.getInt(nColumn++) == 1 ? true : false);
                //articolo.setArticoloGiacenze(estraiArticoloComposizionePerFattura(idArticolo,false,null));
                articolo.setArticoloGiacenze(artGiacenza);
                if (estraiArticoloPerFornitore)
                    articolo.getArticoloGiacenze().setArticoliFornitore(estraiArticoliPerFornitore(idArticolo));
            }
            rs.close();    
            stmt.close();  
        } catch (Exception e) { 
            log.logStackTrace(e);
        }
        return articolo;
    }

К вашему сведению, (condition ? true : false) можно упростить до (condition)

khelwood 10.07.2024 11:46

Я не понимаю

bircastri 10.07.2024 11:50

Является ли столбец codarticolo в таблице [базы данных] VISTAARTICOLI уникальным ключом? Другими словами, будет ли запрос [SQL] (в методе estraiArticoloCompleto) всегда возвращать одну строку?

Abra 10.07.2024 11:56

да, он возвращает одну строку

bircastri 10.07.2024 11:57

Чтобы объяснить комментарий Хелвуда: вместо rs.getInt(nColumn++) == 1 ? true : false просто сделайте rs.getInt(nColumn++) == 1 - меньше кода = меньше вероятность ошибок.

k314159 10.07.2024 13:05
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
5
60
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете выполнить рефакторинг своего кода для выполнения одного запроса в базе данных:

Сначала переберите результаты и сохраните нужные вам идентификаторы:

if (!articoloF.getCodiceArticolo().equalsIgnoreCase("-")  
                        && !articoloF.getCodiceArticolo().equals(WFConst.COD_RITENUTA_ACCONTO)
                        && !articoloF.getCodiceArticolo().equals(WFConst.CODICE_IBAN)){
                    // Store Ids Integer.parseInt(articoloF.getCodiceArticolo())
                    

Затем вам нужно создать запрос, который получает список идентификаторов, а не один.

public List<ArticoliDett> estraiArticoloCompleto(List<Integer> ids, Boolean estraiArticoloPerFornitore){
    ArticoliDett articolo = new ArticoliDett(); 
    String query = "SELECT CODARTIcOLO,nomearticolo,soglia,prezzomedio,"
            + "quantita,prezzoattuale,prezzorivenditore, "
            + "prezzoingrosso,iva,quantitacartone,quantitaPedane, " 
            + "IN_SCHEDA_LAVORO, IS_LAVORO "
            + "FROM VISTAARTICOLI "
            + "WHERE codarticolo in ?";

И, наконец, вы выполняете обработку всех записей.

Другие вопросы по теме