Мне нужно улучшить производительность моего кода. У меня есть следующий код:
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;
}
Я не понимаю
Является ли столбец codarticolo
в таблице [базы данных] VISTAARTICOLI
уникальным ключом? Другими словами, будет ли запрос [SQL] (в методе estraiArticoloCompleto
) всегда возвращать одну строку?
да, он возвращает одну строку
Чтобы объяснить комментарий Хелвуда: вместо rs.getInt(nColumn++) == 1 ? true : false
просто сделайте rs.getInt(nColumn++) == 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 ?";
И, наконец, вы выполняете обработку всех записей.
К вашему сведению,
(condition ? true : false)
можно упростить до(condition)