Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    Java e MySql ridurre chiamate a DB

    Salve avrei un quesito da porvi.

    Ho un metodo tipo questo.

    codice:
    public void registra(){
       for(int i=0; i< table.getRowCount(); i++){
          //recupero il codice presente alla riga iesima della prima colonna
          String codice = table.getValueAt(i, 0);
        MioOggetto oggetto = mappa.get(codice);
       db.inserisciArticolo(oggetto);
       db.aggiornaMagazzino(oggetto);
       }
    }
    allora la classe db, è la classe che consente interagisce con il mio DB che è MySql 5.0.

    Ad ogni iteraa io vado a prendere dalla mappa, un mio oggetto e vado ad eseguire per ogni iterata due operazioni a DB. Una per scalare la quantità dal magazzino "funzione aggiornaMagazzino", e va ad aggiungere un nuovo record in una tabella attraverso il metodo inserisci articolo.

    Ora cosa accade all'interno dei metodo aggiornaMagazzino e inserisciArticolo è il seguente.

    public static void aggiornaMagazzino(MioOggetto oggetto){
    PreparedStatement stmt = conn.prepareStatement("UPDATE ARTICOLO SET QUANTITA = QUANTITA - ? where codice = ?");
    stmt.setInt(1, oggetto.getQuantita);
    stmt.setString(2,oggetto.getString);

    }

    ora dal momento che la tabella può contenere in media 10 15 righe, io vado a eseguire a DB 20 / 30 chiamate e questo risulta essere un pò lento.

    Ci sarebbe un modo per ridurre il numero di chiamate a DB? Perchè si riscontrano casi di lentezza. Per dirvi sul mio PC che è molto veloce l'operazione avviene quasi instantaneamente ma su un pc un pò più lento, non tanto tale operazione avviene anche in 7 8 secondi, e non va bene.

    Mi potete dare qualche consiglio?????
    }

  2. #2
    ciao ragazzi nessuno a darmi una mano?

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Alcune piccole migliorie puoi farle
    Ottieni prima l'elenco completo degli articoli e memorizzalo in una collezione.
    Poi passa la collezione al metodo (ovviamente, dovrai modificare la firma del metodo) e modificalo in questo modo:

    codice:
    public static void aggiornaMagazzino(List<MioOggetto> oggetti){
       PreparedStatement stmt = conn.prepareStatement("UPDATE ARTICOLO SET QUANTITA = QUANTITA - ? where codice = ?");
       for(MioOggetto mo : oggetti) {
          stmt.setInt(1, mo.getQuantita);
          stmt.setString(2,mo.getString);
          stmt.executeUpdate();
       }
       stmt.close();
    }
    Questa è una prima miglioria: invece di creare un nuovo oggetto Statement per ciascun oggetto da modificare, ne crei uno solo e lo ricicli (le PreparedStatement sono state inventate proprio per questo!). Questo dovrebbe già darti dei piccoli risultati in termini di prestazioni.

    Una seconda "miglioria" (da valutare se possa effettivamente essere una miglioria o meno) consiste nell'effettuare queste due operazioni:

    1) Raggruppi tutti i prodotti che hanno la stessa quantità da togliere

    2) Effettui una unica query di update per ciascun gruppo di prodotti, sempre riciclando la stessa PreparedStatement.

    Se ti interessa questa seconda soluzione, posso provare a stendere due righe di codice di esempio.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  4. #4
    Ciao allora la prima soluzione che mi hai proposto è quello proprio che intendevo io.

    Solo che non sapevo che potevo tenere sempre lo stesso statement. Per le quantità unite, purtroppo è molto difficile che più prodotti abbiano le stesse quantità io credo che già questo dovrebbe migliorare tutto il codice.

    E ti ringrazio molto per questo.

    Ovviamente maagari per risparmiarmi un ciclo, posso secondo te provare a fare una roba del genere.

    Io eseguo due query una che DECREMENTA le quantità e l'altra che inserisce l'articolo in una tabella "VenditaArticoli".

    Poichè le info sono contenute sempre all'interno dello stesso oggetto "MioOggetto" potrei fare tutto all'interno dello stesso ciclo?? Creandomi chiaramente due PreparedStatement????

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Originariamente inviato da bircastri
    Poichè le info sono contenute sempre all'interno dello stesso oggetto "MioOggetto" potrei fare tutto all'interno dello stesso ciclo?? Creandomi chiaramente due PreparedStatement????
    Ovviamente sì.

    Poi, sta a te capire se questa è una buona separazione della logica di funzionamento o meno anche se, come si sa, buona separazione e ottime prestazioni spesso non vanno propriamente a braccetto.

    Per quanto riguarda il raggruppamento degli articoli in base alle quantità, direi che potresti comunque implementarla: male che vada (ovvero, tutti articoli con quantità differenti) non perdi nulla ed effettui lo stesso identico numero di query che già fai ora, ma nel caso in cui anche solo due prodotti avessero la stessa quantità da togliere, ecco che risparmi una query.

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  6. #6
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    e usando delle batch insert e batch update? Ti troveresti a preparare due sole query, lunghe, e poi in un colpo solo le puoi scaricare sul database.
    Potresti provare a fare un po' di benchmark con tutte le possibili soluzioni e vedere quale si comporta meglio. Per una lettura sulle batch:

    http://docs.oracle.com/javase/1.3/do....1.frame6.html
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  7. #7
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Originariamente inviato da Andrea1979
    e usando delle batch insert e batch update?
    Ottimo spunto.

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  8. #8
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    147
    E una volta addentrato nel performance tuning direi di dare uno sguardo anche agli indici e alle impostazioni relative alla cache (abilitazione e dimensionamento).

  9. #9
    Allora, a questo punto colgo l'occasione per chiedervi questo.

    Sto approcciando questo metodo di ottimizzazione delle chiamate a DB, in quanto sul PC ove gira questo programmino ho notato che le transazioni a DB, o cmq qualsiasi cosa che interagisce col db è più letto rispetto allo stesso programma che gira su altri PC:

    C'è un modo per testare la velocità di connessione o cmq ottimizzare il tutto???

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.