Hallo,
hab mal eine Frage...
Ich lagere gerade einige
DB Prozesse in einen service aus, welcher wiederrum auf dem Server läuft. Dazu habe ich mir einen ThreadPool gebaut und Datenbanken klassifiziert, ob sie in einem Thread allein laufen (weil viel genutzt), oder ob sie ihn sich mit 3 oder 15 DBs teilen (Also max DBs ist 1, 4 oder 16 bis jetzt)
In denen führe ich eine stored procedure aus (über UniDAC), welche dann entscheidet, welche Aufgabe erledigt werden soll. Soweit, so gut.. das geht auch alles sehr schön und flink, auch die Erzeugung und Schliessung von Threads.
Jetzt kommt der theoretische Fall den ich bedenken muss :
Wenn die Stored Procedure aus irgendwelchen Gründen mal nicht zurück kommt, klebt sich der thread ja fest (und wenn er geshared ist mit anderen DBs, wird bei denen ja auch nichts mehr ausgeführt). Dazu habe ich ein Ping Pong eingebaut über Windows Nachrichten, welche alle 30 sekunden die threads fragt, ob sie noch leben. Heisst, wenn ein thread nicht antwortet, schlägt der timer nach 30 sekunden wieder auf und erkennt, dass der thread nicht geantwortet hat und soll ihn beenden und neu erstellen (habe alle information, um ihn neu zu starten).
Problem ist, beim Thread.Free bleibt alles stehen dann. wenn threads sich normal dort beenden (weil der letzte User raus ist), geht alles toll. Aber ich kann ja nicht Terminated auf true setzen, weil der thread ja blockiert ist.
Gibt es ideen ?
Code:
Try
UsageLevel := vtThreadDataUsageLevel.Value;
OldThreadId := vtThreadDataThreadId.Value;
EnterCriticalSection(aCriticalSection);
FpThread := TDatabaseConnectionThread(Pointer(vtThreadDataaObj.AsInteger));
FpThread.Free;
LeaveCriticalSection(aCriticalSection);
except
On E:
Exception Do
CodeSite.Send( csmLevel1, 'Error deleting thread', E.Message);
End;