Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 28

Discussione: Problema Timeout SQL

  1. #1
    Utente di HTML.it L'avatar di supermac
    Registrato dal
    Jun 2001
    Messaggi
    1,638

    Problema Timeout SQL

    Scenario:
    Ecommerce con tabella articoli contenente 150k records

    La procedura di caricamento articoli da un db esterno verso il db dell'ecommerce prevede che gli articoli in ecommerce siano messi temporaneamente nello stato "non live" e poi siano riattivati manmano che vengono letti e aggiornati dal db esterno.
    Succede che il semplice update della tabella degli articoli per mettere live = 0 a tutti i record vada in timeout.
    Ok potrei allungare il timeout di esecuzione degli script nella pagina ma mi interessa qui sapere se esistono strategie diverse per fare la cosa.
    Nota importante: il timeout avviene sull'update della tabella prodotti DOPO che ho già effettuato un update su un'altra tabella uguale che contiene altrettanti records .... qui il codice:
    codice:
     Dim cn = New SqlConnection(ConfigurationManager.ConnectionStrings("Konn").ConnectionString)
                Using cn
                    'metto offline articoli in tabella mirror
                    cn.Open()
                    Dim strsql As String = "UPDATE prodottiMirror SET Live = 0"
                    Dim cmd2 = New SqlCommand(strsql, cn)
                    cmd2.ExecuteNonQuery()
                    'metto offline i prodotti 
                    strsql = "UPDATE prodotti SET Live = 0"
                    cmd2 = New SqlCommand(strsql, cn)
                    cmd2.ExecuteNonQuery()
                    ....
    Va in timeout il secondo update.
    Una prova che sto per fare è incapsulare gli update in connessioni separate per vedere se la cosa ha un effetto sui tempi di esecuzione (così suggerivano in altro forum senza però spiegare perchè dovrebbe essere risolutivo) vi faccio sapere, però voi come vi comportate in situazioni simili? Dividete le operazioni su blocchi di dati? Usate stored procedure? ....
    W la Ferari effetrenavenave!
    il computer è un somaro veloce! (neanche tanto ndr)

  2. #2
    se il db target è M$SQLSERVER (non l'hai specificato) SP sempre

  3. #3
    Utente di HTML.it L'avatar di supermac
    Registrato dal
    Jun 2001
    Messaggi
    1,638
    Pardon è vero, MS SQL
    W la Ferari effetrenavenave!
    il computer è un somaro veloce! (neanche tanto ndr)

  4. #4
    prova a usare una SP e facce sape'

  5. #5
    Moderatore di ASP.net L'avatar di djciko
    Registrato dal
    Nov 2002
    Messaggi
    6,663
    prova ad istanziare un nuovo command, vedo che hai usato la stessa variabile

    (comunque si dovrebbero usare le stored)

  6. #6
    Moderatore di ASP.net L'avatar di djciko
    Registrato dal
    Nov 2002
    Messaggi
    6,663
    prova ad usare questa (storica) classe:


    uso: databaseWrapper.ExecInsertUpdateDelete("UPDATE tab SET campo=0", "server=10.10.10....");



    codice:
        public class databaseWrapper
        {
    
    
            private static SqlConnection internal_SQLCONN;
            private static SqlCommand internal_SQLCOMMAND;
            private static SqlDataAdapter internal_SQLADAPTER;
    
    
            public static int ExecInsertUpdateDelete(string SQL, string ConnString)
            {
                try
                {
                    internal_SQLCONN = new System.Data.SqlClient.SqlConnection(ConnString);
                    internal_SQLCONN.Open();
                }
                catch (SqlException ex)
                {
                    //ex.Message;
                    return -1;
                }
                catch (Exception ex)
                {
                    //ex.Message;
                    return -1;
                }
    
    
    
    
                internal_SQLCOMMAND = new SqlCommand(SQL, internal_SQLCONN);
    
    
                int affected = 0;
                try
                {
                    affected = internal_SQLCOMMAND.ExecuteNonQuery();
                }
                catch (SqlException ex)
                {
                    //ex.InnerException;
                    return -1;
                }
                catch (Exception ex)
                {
                    //ex.InnerException;
                    return -1;
                }
                finally
                {
                    if (internal_SQLCONN != null && internal_SQLCONN.State == ConnectionState.Open)
                    {
                        try
                        {
                            if (internal_SQLCOMMAND != null)
                                internal_SQLCOMMAND.Dispose();
    
    
                            // Chiude la connessione
                            internal_SQLCONN.Close();
                        }
                        catch (SqlException ex)
                        {
                            //
                        }
                        catch (Exception ex)
                        {
                            //
                        }
                    }
                }
    
    
                return affected;
            }
        }

  7. #7
    Utente di HTML.it L'avatar di supermac
    Registrato dal
    Jun 2001
    Messaggi
    1,638
    Sono in attesa che mi rimettano a posto il dns (me l'han cambiato sotto i piedi mentre stavo per fare la prova con le stored procedure )

    Ok capisco che le stored dal punto di vista delle performance (oltre che della sicurezza) siano nettamente migliori, ma l'usare due connessioni (o due command) separati cosa dovrebbe migliorare?
    Ultima modifica di supermac; 12-11-2019 a 13:49
    W la Ferari effetrenavenave!
    il computer è un somaro veloce! (neanche tanto ndr)

  8. #8
    Utente di HTML.it L'avatar di supermac
    Registrato dal
    Jun 2001
    Messaggi
    1,638
    Niente da fare va in timeout sul secondo executenonquery
    codice:
                Dim cmd2 = New SqlCommand("mac_mirror_offline", cn)
                cmd2.commandtype = CommandType.StoredProcedure
                cmd2.ExecuteNonQuery()
                
                dim cmd3 = New SqlCommand("mac_prod_offline", cn)
                cmd3.CommandType = CommandType.StoredProcedure
                cmd3.ExecuteNonQuery()
    Non mi pare ci siano triggers o altre trappole legate ai records di quella seconda tabella....
    W la Ferari effetrenavenave!
    il computer è un somaro veloce! (neanche tanto ndr)

  9. #9
    forse sulla colonna Live c'è un indice

  10. #10
    cmd3.CommandType = CommandType.StoredProcedure

    ma stai già eseguendo una SP?

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 © 2020 vBulletin Solutions, Inc. All rights reserved.