Entwickler-Ecke

Sonstiges (Delphi) - MySQL- Abfragen füllen Memory


Spatz - Do 17.03.05 14:01
Titel: MySQL- Abfragen füllen Memory
Hallo

Um auf meine MySQL Datenbank zuzugreifen, verwende ich die MySQL.pas von hier [http://www.fichtner.net/delphi/mysql.delphi.phtml].
Nun mein Problem: Um Werte aus der DB auszulesen, bekomme ich bei meiner Anfrage einen Pointer (PMySQL) auf das Ergebnisobjekt (TMySQL) zurück. Das Problem hierbei ist nun aber, dass ich nicht weiss, wie ich dieses Objekt wieder aus dem Speicher freigeben kann, denn wenn ich eine Abfrage mit 1000 Resultatzeilen ausführe, so füllt mir dies den Speicher um ca. 5-10mb (und dies jedes Mal!). Irgentwelche Tips, wie ich dies lösen könnte?

Besten Dank


chrisw - Do 17.03.05 16:29

Ich nutze immer die "Direct Mysql Objects v.1.1" von

hier [http://www.torry.net/quicksearchd.php?String=mysql&Title=Yes]

damit hatte ich noch nie Probleme !


Niho - Mo 18.04.05 22:37

@Spatz:
Nicht mysql_store_result sondern mysql_use_result verwenden. Näheres dazu im MySQL Handbuch.


Tino - Mi 20.04.05 08:10

Moin!

Auf den ersten Blick fallen mir die Funktionen mysql_close und mysql_free_result auf. Hast du dir die schon mal genauer angesehen?

Gruß
Tino


Niho - So 24.04.05 10:16

user profile iconTino hat folgendes geschrieben:
Auf den ersten Blick fallen mir die Funktionen mysql_close und mysql_free_result auf. Hast du dir die schon mal genauer angesehen?

Klar muss im Anschluss mit mysql_free_result eine Abfrage wieder freigegeben werden.

Allerdings lädt mysql_store_result erstmal die komplette Abfrage in den Speicher - nutzt also unter Umständen viele Speicher vollkommen unnötig.

mysql_use_result hingegen lädt immer nur einen Teil der Abfrage. Sobald die entsprechenden Records ausgelesen wurden wird der verwendete Speicher automatisch wieder freigegeben und die nächsten Records werden von der Datenbank abgefragt.

Klar muß hierfür die Datenbank Verbindung aufrecht erhalten werden - und es darf auch keine andere Abfrage zwischendurch über diese Connection abgehandelt werden. Aber der große Vorteil ist: Es sind nie alle Daten zur gleichen Zeit im Speicher! Und es werden auch nicht alle Daten sofort geladen - es entsteht also keine größere Wartezeit für den User.