Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 19
  1. #1

    [SQLSERVER] problema "saltuario" di timeout su query

    Buongiorno a tutti,

    mi sono accorta che la mia pagina web di dettaglio dei miei prodotti mi dà saltuariamente errore di timeout su una query di aggiornamento del mio db. Saltuariamente nel senso che non me lo dà per tutti i prodotti... Questo è il codice:

    codice:
            'Recupero il dato delle visualizzazioni precedenti e il codice ufficio
            sql = "select NumVisualizzazioni, ufficio from faldone where codice=" & codice
            Response.Write(sql & "
    ")
            Dim gestdb As New DBgest
            gestdb.sql = sql
            Dim dati = gestdb.apridati()
            dati.Read()
            Dim visual = dati("NumVisualizzazioni")
            Dim ufficio = dati("ufficio")
            'Inizializzo a 0 se l'articolo è nuovo
            If visual Is DBNull.Value Then visual = 0
            visual = visual + 1
            ' Aggiorno il DB
            sql = "update faldone set NumVisualizzazioni=" & visual & " where codice=" & codice
            gestdb.sql = sql
            Response.Write(sql)
            gestdb.esegui()  REM questa è la query che dà problemi
    Nello specifico un esempio di due query:

    select NumVisualizzazioni, ufficio from faldone where codice=293050

    update faldone set NumVisualizzazioni=11 where codice=293050

    La seconda è quella che mi dà problemi; NumVisualizzazioni è di dito Integer

    Non riesco proprio a capire perchè si verifichi questo problema e tanto meno perchè succeda solo in alcuni casi...

    Grazie in anticipo

  2. #2
    Utente di HTML.it
    Registrato dal
    Apr 2012
    Messaggi
    91
    puoi provare ad eliminare tutto questo pezzo di codice

    codice:
    sql = "select NumVisualizzazioni, ufficio from faldone where codice=" & codice
            Response.Write(sql & "
    ")
            Dim gestdb As New DBgest
            gestdb.sql = sql
            Dim dati = gestdb.apridati()
            dati.Read()
            Dim visual = dati("NumVisualizzazioni")
            Dim ufficio = dati("ufficio")
            'Inizializzo a 0 se l'articolo è nuovo
            If visual Is DBNull.Value Then visual = 0
            visual = visual + 1
    e fare solo la query di update per vedere su funziona il tutto (il codice fa la stessa identica cosa di prima)

    codice:
     ' Aggiorno il DB
            sql = "update faldone set NumVisualizzazioni=NumVisualizzazioni+1 where codice=" & codice
            Dim gestdb As New DBgest
            gestdb.sql = sql
            Response.Write(sql)
            gestdb.esegui()
    Il problema potrebbe essere nel metodo Read che per qualche motivo locka la tabella/riga?

    Se usi sql server potresti usare sqlprofiler e controllare cosa succede sul db. L'operazioni dovrebbe essere istantanea visto che immagino che l'update sia su di un solo record

  3. #3
    mi dà comunque lo stesso problema....

    se può essere d'aiuto l'errore specifico che mi viene restitutito è:



    Riga 115: cmd.CommandType = CommandType.Text
    Riga 116: cmd.Connection = cn
    Riga 117: nraffected = cmd.ExecuteNonQuery()
    Riga 118: Return nraffected
    Riga 119: End Function

    File di origine: G:\siti\sitonew\App_Code\Class1.vb Riga: 117

    Analisi dello stack:


    [SqlException (0x80131904): Timeout. Il tempo disponibile è scaduto prima del completamento dell'operazione o il server non risponde.]
    System.Data.SqlClient.SqlConnection.OnError(SqlExc eption exception, Boolean breakConnection) +1950522
    System.Data.SqlClient.SqlInternalConnection.OnErro r(SqlException exception, Boolean breakConnection) +4856715
    System.Data.SqlClient.TdsParser.ThrowExceptionAndW arning(TdsParserStateObject stateObj) +194
    System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) +1121
    System.Data.SqlClient.SqlCommand.RunExecuteNonQuer yTds(String methodName, Boolean async) +192
    System.Data.SqlClient.SqlCommand.InternalExecuteNo nQuery(DbAsyncResult result, String methodName, Boolean sendToPipe) +317
    System.Data.SqlClient.SqlCommand.ExecuteNonQuery() +137
    DBgest.esegui() in G:\siti\sitonew\App_Code\Class1.vb:117
    ricercascheda.incrementa_visualizzazioni() in G:\siti\sitonew\new\ricercascheda.aspx.vb:58
    ricercascheda.Page_Load(Object sender, EventArgs e) in G:\siti\sitonew\new\ricercascheda.aspx.vb:313
    System.Web.UI.Control.OnLoad(EventArgs e) +99
    System.Web.UI.Control.LoadRecursive() +50
    System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +627


    io non ho accesso al db se non tramite query...

  4. #4
    quanti record dovrebbe aggiornare?

  5. #5
    solo uno perchè codice è univoco

  6. #6
    Utente di HTML.it
    Registrato dal
    Apr 2012
    Messaggi
    91
    Esegui solo te l'accesso a quella tabella o possono esserci altre query che magari fanno transazioni lunghe col lock esclusivo?

    L'errore ti si verifica sempre e solo sugli stessi record o è randomico? l'update di 1 solo record direi che è quasi impossibile che vada in timeout.

    Il db di Sql server è in locale o su server dedicato? Nel caso non fosse in locale puoi provare a portarti il db in locale e vedere se ti da lo stesso errore.

  7. #7
    allo stesso db ci sono più accessi in contemporanea, ma in ogni caso di tipo select: il record è stato aggiornato l'ultima volta il 5 di settembre e il problema me lo dà anche in questo momento.
    Inoltre si verifica solo su taluni codici: ho proprio appena provato... ho richiesto la scheda di dettaglio di un codice e mi è andato in timeout, l'ho fatto subito prima e subito dopo per un altro e nessun problema...

    Ho provato a fare la stessa query attraverso l'apposito strumento che ho a disposizione per interrogare il db su server e viene eseguita correttamente, mentre nella pagina del sito no...

  8. #8
    Utente di HTML.it
    Registrato dal
    Apr 2012
    Messaggi
    91
    giusto per curiosità hai provato a modficare il commandtimeout?

    Prova a metterlo a 0 e vedere se almeno cosi esegue la query e non va in timeout.

    cmd.CommandTimeout = 0;

  9. #9
    una domanda scusa: visto che la mai query dà problemi quando viene richiamata dalla pagina del sito, come faccio a dargli questo comando?

  10. #10
    Utente di HTML.it
    Registrato dal
    Apr 2012
    Messaggi
    91
    Immagino devi farlo nella classe DBgest. Facendo riferimento all'errore puoi metterlo dopo la riga 115.

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.