Hallo,
ich entwickel gerade ein Tool, welches eine extrem große und langwierige MySql Abfrage an ca. 400 Datenbanken stellt. Dabei laufe ich in einer Schleife über alle Datenbanken und erstelle mir eine temporäre Datenbank.
Klappt alles bestens, wie es soll. Allerdings stoße ich bei einer besonders großen Datenbank (und länger dauernden Abfrage) an das Problem, dass mein try-Block nach ca 30 Sek. einen Timeout-Fehler wirft. Angeblich weil der Datenbankserver nicht mehr antwortet.
Wie kann ich dieses Problem am besten elegant umgehen? Ich würde den Programmcode gerne Schützen, sodass meine Application auf das beenden des Codes wartet. Mit dem Versuch den Teil einfach in einen Thread auszulagern kam ich nicht weit.
Über Tipps die mir weiterhelfen wäre ich sehr dankbar!
Nicht Dein Try Block wirft ein Timeout, sondern Deine SQL Abfrage. Schau mal nach OleDbCommand.CommandTimeout.
Traumhaft! Das war der Fehler. Nach erhöhen der Timeoutzeit auf 7 Minuten klappt es bestens.
Vielen Dank!
Noch eine Frage bezüglich des CommandTimeouts. MS SQL 2005 verwendet ja auch dieses Field (default: 30sec) um die Ausführlänge von Commands zu begrenzen.
SqlCommand.CommandTimeout:
http://msdn.microsoft.com/de-de/library/system.data.sqlclient.sqlcommand.commandtimeout(VS.80).aspx
Was spricht dagegen, diesen defaultwert von 30 auf sagen wir mal 60*10 = 10min anzuheben? Ich habe einige wenige StoredProcedures, die teilweise bis zu 5min benötigen. Und möchte des einfach global für alle Commands verwenden.
Meine negativern Effekte:
Kennt jemand andere Effekte? Oder andere Dinge die dagegen sprechen?
Danke und gruss
dataCore
Da spricht grundsätzlich nichts dagegen. Das SSMS verwendet für seine Queries ja auch keinen Timeout. Diese 30 Sekunden sind nur ein Pi*Daumen Richtwert wie lange man einen Anwender warten lassen kann/sollte.
Wir haben hier Jobs die nachts bis zu mehrere Stunden laufen. Hier ist die CommandTimeout auf 0 (kein Timeout) gestellt.
Blog: Things about Software Architecture, .NET development and SQL Server
Twitter
Google+
Je mehr ich weiß, desto mehr weiß ich was ich noch nicht weiß.
Beim Wert 0 wird der Commandtimeout ausgehebelt? ... ist auch eine Überlegung wert. So wäre man selber verantwortlich, dass man keinen Endlosloop in seine Commands reinknallt...
Falls also keine anderen Seiteneffekte damit verbunden sind, werde ich das mal auf eine Stunde, oder wie du sagst, ganz auf 0 setzten.
gruss und danke!
dataCore