-1

I need to improve the performance of my code. I have the following code:

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;
        }
    }

For every item inside Iterator I need to make a query on my database. The line is this:

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

I see that line is to slow. This is the estraiArticoloCompleto method that get Articles from database:

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;
    }
5
  • 2
    FYI (condition ? true : false) can be simplified to (condition)
    – khelwood
    Commented Jul 10 at 9:46
  • I don't understand
    – bircastri
    Commented Jul 10 at 9:50
  • Is column codarticolo, in [database] table VISTAARTICOLI a unique key? In other words, will the [SQL] query (in method estraiArticoloCompleto) always return a single row?
    – Abra
    Commented Jul 10 at 9:56
  • yes it return a single row
    – bircastri
    Commented Jul 10 at 9:57
  • To explain khelwood's comment: instead of rs.getInt(nColumn++) == 1 ? true : false just do rs.getInt(nColumn++) == 1 - less code = less chance of bugs.
    – k314159
    Commented Jul 10 at 11:05

1 Answer 1

3

You can refactor your code to run a single query in the database:

First iterate over the results and store the ids you need:

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

Then you need to create a query that receives a list of IDs and not a single one

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 ?";

And finally you do the processing for all records.

Not the answer you're looking for? Browse other questions tagged or ask your own question.