Seite 1 von 1

Datenbankabfrage dauert lange=>Programm hängt sich auf

Verfasst: 28.12.2015 15:52
von Paddy1988
Guten Tag liebe Community,

ich habe mich heute hier im Forum angemeldet da ich habe ein Problem habe an welchen ich schon ca. 1-2Wochen hänge und absolut nicht mehr weiter weiß :-(.

Und zwar bin ich gerade dabei ein Programm zu schreiben welches aus Datenbankabfragen CSV Dateien erzeugt, der User kann eigene Abfragen hinterlegen und heraus soll eine CSV-Datei kommen.
Dies funktioniert auch soweit perfekt, jedoch habe ich einige Abfragen dabei welche zum Teil 60Sekunden und weit darüber hinaus dauern. Dies liegt einfach daran weil diese Abfragen über sehr viele Tabellen und sehr viele Verzweigungen gehen(ist aber alles nicht das Problem)

Die Abfragen dauern auch im PGAdmin so lange, also an Purebasic liegt es nicht.

Nun zum eigentlichen Problem:

Wenn der User die CSV Datei erzeugt, wird die Datenbankabfrage ausgeführt und die Daten in eine CSV-Datei geschrieben, klappt soweit ganz gut sofern die Abfrage nicht allzu lange dauert. Wenn die Abfrage sehr lange dauert dann hängt sich das Programm auf.
Die Abfrage wird aber weiter ausgeführt auch wenn das Programm hängt, wenn die Abfrage dann irgendwann abgeschlossen ist dann funktioniert auch das Programm wieder und die CSV-Datei ist auch korrekt erzeugt worden.

DatabaseQuery(#Datenbank, Abfrage$ [, Flags]) ;dauert zum Teil 60Sekunden und Programm hängt sich auf solange die Abfrage läuft.

Ich hatte schon etwas mit Threads gelesen und auch versucht, aber leider hat es nicht geklappt, ich müsste da meine SQL Abfrage übergeben können.
Daher wollte ich einmal fragen wie ihr so etwas löst, ich denke das Problem müssen ja mehrere haben. Ich wäre über jeden Lösungsansatz sehr dankbar.

Ich bedanke mich schon einmal vorab.

Gruß Paddy :-)

Re: Datenbankabfrage dauert lange=>Programm hängt sich auf

Verfasst: 28.12.2015 16:05
von NicTheQuick
Prinzipiell kannst du das mit Threads machen.

Was mich aber mehr wundert, ist, dass die Datenbankabfrage so langsam ist. Hast du die Tabellen selbst erstellt und die Beziehungen, Schlüssel und Indices korrekt angelegt? Oder wie riesig ist diese Datenbank denn, dass es so lange dauert?

Hier ein Beispiel um Strings an einen Thread zu übergeben.

Code: Alles auswählen

EnableExplicit
Structure ThreadData
	sql.s
	file.s
EndStructure

Procedure Thread(*tData.ThreadData)
	Debug "Das ist der SQL-String: " + *tData\sql
	Debug "Führe aus..."
	Delay(10000)
	
	Debug "SQL-Anfrage ausgeführt."
	Debug "Schreibe Datei: " + *tData\file
	Delay(1000)
	Debug "Thread fertig."
EndProcedure

Define tData.ThreadData
tData\sql = "Select * from myTable"
tData\file = "/tmp/export.data"

Define thread.i = CreateThread(@Thread(), tData)

Define i.i = 0

While IsThread(thread)
	Debug "Warte seit " + i + " Sekunden auf Thread."
	i + 1
	Delay(1000)
Wend
Aber in diesem Beispiel sollte nur einziger Thread gleichzeitig parallel zum Hauptprogramm laufen. Oder du erstellst die mehr Variablen wie tData.

Re: Datenbankabfrage dauert lange=>Programm hängt sich auf

Verfasst: 28.12.2015 16:09
von edel
Vereinfacht gesagt: Dein Code blockiert die Eventabfrage, daher kann das Fenster keine Abfragen verarbeiten.

Beispiel:

Code: Alles auswählen

Procedure Main()
  Protected i
  
  If OpenWindow(0, 0, 0, 300, 300, "")
    
    ButtonGadget(0, 0, 0, 100, 24, "Button")
    
    ;Aufgabe 
    While i < 100000000
      i+1
    Wend
    
    Repeat
    Until WaitWindowEvent() = #PB_Event_CloseWindow
    
  EndIf
  
  
EndProcedure:End Main()

Mit Thread klappt das dagegen sehr gut :

Code: Alles auswählen

Enumeration #PB_Event_FirstCustomValue
  #EventStart
  #EventStop
EndEnumeration

Structure MeineDaten
  SQL.s
EndStructure

Procedure Aufgabe(*dummy.MeineDaten)
  
  Debug *dummy\SQL
  
  PostEvent(#EventStart)
  ;Aufgabe 
  While i < 100000000
    i+1
  Wend
  PostEvent(#EventStop)  
EndProcedure

Procedure Main()
  Protected i
  Protected event
  Protected daten.MeineDaten
  
  daten\SQL = "select usw..."
  
  If OpenWindow(0, 0, 0, 300, 300, "")
    
    CreateThread(@Aufgabe(), @daten)
    
    Repeat
      
      event = WaitWindowEvent()
      
      If event = #EventStart
        SetWindowColor(0, $BF36FF)        
      EndIf
      
      If event = #EventStop
        SetWindowColor(0, #PB_Default) 
      EndIf
      
    Until event = #PB_Event_CloseWindow
    
  EndIf
  
EndProcedure:End Main()


Re: Datenbankabfrage dauert lange=>Programm hängt sich auf

Verfasst: 29.12.2015 08:57
von Paddy1988
Vielen Dank für eure Hilfe, ich werde das heute testen und versuchen heute oder morgen in mein Programm einzubauen.

Tausend Dank Jungs, top! :bounce:

Ich werde mich wieder melden ob es geklappt hat, falls nicht vor Silvester dann einen guten Rutsch!!!

Re: Datenbankabfrage dauert lange=>Programm hängt sich auf

Verfasst: 11.01.2016 09:31
von Paddy1988
Erstmal allen ein gesundes Neues 2016,


ich wollte nur bescheid geben dass es mit dem Thread erstellen super funktioniert hat. Vielen Dank für eure Hilfe :D :allright: