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

    [JSP] - Query Update va in NullPointerException

    Ciao ragazzi,

    ho un piccolo problema a cui non riesco a trovare una soluzione.
    In pratica in una pagina jsp ho una tabella (popolata tramite delle SELECT SQL) e un bottone: premendo tale bottone vado ad eseguire una query UPDATE sulle righe di tale tabella.

    Ora: se seleziono (attraverso checkbox) 10-20-30 righe, effettua la query di UPDATE senza alcun problema; se invece decidessi di effettuare un UPDATE MASSIVO (seleziono tutte le righe della tabella, possono essere anche 20000 righe), ho notato che:
    • non viene eseguita alcun update
    • mi si presenta la pagina di errore di tomcat con una NULLPOINTEREXCEPTION


    Ho subito pensato che il problema potrebbe proprio essere causato dall'update di grandi dimensioni che vado ad eseguire.
    La struttura del codice che utilizza la query è questa:
    • apertura ciclo for
    • apertura connessione DB
    • esecuzione query update
    • chiusura statement
    • chiusura connessione
    • fine ciclo for


    Quale potrebbe essere secondo voi una soluzione per ovviare a questo problema che mi si presenta? Oppure la soluzione è solamente quella di effettuare poche query update per volta?

    Spero di essere stato chiaro!
    Grazie a tutti in anticipo.
    Ciao ciao

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Non capisco che relazione ci possa essere tra una NPE ed il numero di query da eseguire (o numero di record da aggiornare).
    Più probabile che l'errore stia altrove o che dipenda da particolari dati.
    Non hai fornito il codice che esegue le query, né il codice che effettua gli update, né il codice che richiama queste due (parli genericamente di JSP: accessi a DB dovrebbero essere fatti da Servlet, non da JSP... le JSP non dovrebbero fare alcun lavoro se non quello di visualizzare i dati elaborati dalle servlet), quindi è praticamente impossibile fornirti alcuna risposta.

    C'è da dire che update massivi andrebbero fatti con un po' di ragionamento: JDBC offre i BatchUpdate, ma è comunque doveroso porre un limite al numero di statement che vengono messe in batch (per ovvi limiti del DBMS sottostante).

    Un primo consiglio è quello di fornire almeno la parte rilevante del codice che stai usando, così da capire esattamente lo scenario.


    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

  3. #3
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da billymerendina Visualizza il messaggio
    Quale potrebbe essere secondo voi una soluzione per ovviare a questo problema che mi si presenta?
    Senza vedere il tuo codice, riuscirei più facilmente a vincere al lotto ....
    E sperando che il tuo codice non sia il solito miscuglio di HTML e codice Java tutto in una JSP.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  4. #4
    Beh dai...così mi offendete!!!
    Il problema è che nemmeno io capisco la relazione tra un NPE ed una esecuzione di query massivo.
    Non vi avrei scritto altrimenti.
    Cmq ok, vi fornisco il codice, vediamo se è più esplicativo della mia "struttura".

    Questa è la servlet che esegue l'update della query:
    codice:
    if (strategy.compareTo("") != 0 && strategy.compareTo("Seleziona strategy") != 0) {
        for (int i = 0; i < elencoContrattiVett.length; i++) {
            String nb = elencoContrattiVett[i];
            String update = new StringBuilder("update TRN_HDR_DBF set M_BSTRATEGY =                                      case 
                                            when (M_COMMENT_BS='B') then  '")
                                                    .append(strategy)
                                            .append("' else '' end, ")
                                        .append("M_SSTRATEGY = case 
                                            when (M_COMMENT_BS='S') then  '")
                                                    .append(strategy)
                                            .append("' else '' end 
                                        where M_NB=").append(nb).toString();
        int row_update = StrategyDBAccess2.updateStrategyEquity(update);
        }
    }
    E questa invece è la classe che implementa la query:
    codice:
    public static int updateStrategyEquity(String update) {
        int i;
        try {
            Class.forName("com.sybase.jdbc3.jdbc.SybDriver").newInstance();
            Connection conn
            = DriverManager.getConnection(new StringBuilder
                              ("jdbc:sybase:Tds:").append
                              (ipdb).append
                              (":").append
                              (portdb).append
                              ("/").append
                              (db).toString(),
                              userdb, pswdb);
            Statement statement = conn.createStatement(1005, 1008);
            int row = statement.executeUpdate(update);
            statement.close();
                conn.close();
            //writeLog(update);
                System.out.println("QUERY UPDATE: " +update);
            i = row;
        } catch (Exception e) {
            e.printStackTrace();
            return 0;
        }
        return i;
        }
    E questo è il risultato che ottengo:image001.jpg
    (l'immagine è piccola), ma vi assicuro che si tratta di un NPE.

    Grazie.

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da billymerendina Visualizza il messaggio
    Beh dai...così mi offendete!!!
    E su cosa?

    Quote Originariamente inviata da billymerendina Visualizza il messaggio
    E questa invece è la classe che implementa la query:
    codice:
    public static int updateStrategyEquity(String update) {
        int i;
        try {
            Class.forName("com.sybase.jdbc3.jdbc.SybDriver").newInstance();
            Connection conn
            = DriverManager.getConnection(new StringBuilder
                              ("jdbc:sybase:Tds:").append
                              (ipdb).append
                              (":").append
                              (portdb).append
                              ("/").append
                              (db).toString(),
                              userdb, pswdb);
    
         .......
    Sicuramente ripetere il caricamento del driver e la creazione della Connection per ciascun singolo update (e come dicevi es. 20000 righe) porta problemi, come minimo a livello di performance.

    Quote Originariamente inviata da billymerendina Visualizza il messaggio
    E questo è il risultato che ottengo:
    (l'immagine è piccola), ma vi assicuro che si tratta di un NPE.
    Non puoi semplicemente precisare su quale riga avviene il NPE?
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Ti crediamo quando dici che si tratta di una NPE, ma il problema è: dove si verifica? Ovvero, controlla/posta lo stackTrace (lo screenshot è troppo piccolo e sarebbe comunque troppo poco): verifica sui log di Tomcat (o dell'ApplicationServer)... ci trovi sicuramente lo stackTrace completo dell'eccezione che ti dice esattamente a quale riga viene sollevata l'eccezione, in modo da capire cosa può andare storto.

    C'è da dire che stai massacrando brutalmente la macchina e il DBMS: per ogni singola update da fare tu carichi il driver JDBC, apri la connessione col DB, esegui la query (senza usare PreparedStatement, ma Statement semplici con concatenazione... ma vabbè), chiudi lo statement, chiudi la connessione.

    Un consiglio spassionato:

    1) Carica il driver JDBC: una sola volta per tutta la vita della WebApplication
    2) Apri la connessione col DB: una sola volta per tutta la vita del DB... al limite, una sola volta per sessione utente
    3) Usando la connessione aperta, esegui TUTTE le query che ti servono (selezione, update, delete, ecc)
    4) La connessione al DB chiudila una sola volta alla fine della sessione utente (o appena prima di chiudere la WebApplication)


    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

  7. #7
    Ho modificato un po' il codice grazie anche i vostri suggerimenti ed effettuando una analisi più approfondita ho notato che l'NPE si verifica sulla riga dell'if:
    codice:
    if (strategy.compareTo("") != 0 && strategy.compareTo("Seleziona strategy") != 0) {
    Questo mi ha fatto venire in mente una cosa: siccome il parametro "strategy" e il parametro elencoContrattiVett[i] derivano da una querystring e poi elaborati dalla servlet, al 99% posso affermare che la servlet va in NPE per via del numero limitato di caratteri passabili sulla querystring: il parametro strategy non viene popolato se presenti troppi caratteri prima (elencoContrattiVett è un numero di circa 10 cifre...che moltiplicato per 20000....fa tanto, forse troppo!! 2000000).

    Provvederò a modificare tale situazione, e a riprovare.
    In caso mi si riproponesse ancora l'errore mi ritroverete qui davanti!
    Altrimenti vi ringrazio per il supporto datomi!!

    Non per discolparmi, ma volevo solo farvi presente che sto mettendo mano ad un codice non di mia proprietà...io avrei impostato in maniera differente la cosa, ma le menti umane sono veramente differenti!!

    Ciao e grazie ancora!!

  8. #8
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Le query preparate concatenando stringhe non si possono vedere però...

    Vale quanto detto di qua
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

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.