2012-07-16 4 views
6

Ho una query che richiede più tempo per l'esecuzione man mano che il database aumenta di dimensioni. La query è ottimizzata e necessaria, ma il mio C# applicazione console ha recentemente mi sta dando questo errore:MySqlException: Timeout scaduto - L'aumento del timeout della connessione non ha avuto alcun effetto

Unhandled Exception: MySql.Data.MySqlClient.MySqlException: Timeout expired. 

L'aumento del tempo di connessione nella stringa di connessione non aiuta; Ho aumentato da

Connect Timeout=28800

a

Connect Timeout=128800

ma sto ancora ottenere l'errore, nonostante questo cambiamento.

Se si esegue la query dal workbench MySQL ci vogliono solo circa 10 secondi, quindi non sono sicuro su come impedire questa eccezione non gestita.

Ci sono altre cose oltre a "il tempo richiesto da una query", che può produrre questa eccezione?

+3

Potete mostrare il codice? –

+8

Modificare CommandTimeout non ConnectionTimeout. –

+0

Eccezione non gestita: System.ArgumentException: parola chiave non supportata. Nome parametro: connecttimeout in Application.MainClass.Main (String [] args) Oh, ho bisogno di leggerti con più attenzione, "CommandTimeout". –

risposta

16

ho avuto questo problema prima. La proprietà ConnectTimeout si applica solo ai timeout che si verificano durante la connessione al database, non alle query.

CommandTimeout tuttavia specifica per quanto tempo deve attendere il ritorno della query. Credo che il valore predefinito sia 30 secondi. Controlla la documentazione per la tua libreria MySql, ma per SqlCommand il CommandTimeout è in secondi non millisecondi.

+3

In MySQL è anche secondi. anche - 0 non è scaduto. –

3

Se puoi mostrarci il tuo metodo, possiamo aiutarti a trovare gli errori.

Se la storia (e SO) mi ha insegnato qualcosa, la sua

"You better be using Paramaterized SQL statements before posting any code" 

Se non siete sicuri su come utilizzare i comandi con parametri qui è un esempio (tratto da una delle risposte in cui non ho usato con parametri SQL)

var command = new MySqlCommand(
    "SELECT * FROM tblPerson WHERE LastName = @Name AND Height > @Height AND BirthDate < @BirthDate", connection); 

command.Parameters.AddWithValue("@Name", lastname); 
command.Parameters.AddWithValue("@Height", height); 
command.Parameters.AddWithValue("@Name", birthDate); 

Prova che, se non l'hai già e inviare un codice :)

+0

Grazie per questo suggerimento –

1

Si può anche provare ad aggiungere "default command timeout = 360" nella stringa di connessione; es.

Server=myServerAddress;Database=myDataBase;Uid=myUsername;Pwd=myPassword;default command timeout=20; 

Questa opzione è disponibile da Connector/NET versione 5.1.4.

[Sollevai questo da connectionstrings.com/mysql/