| PostgreSQL: Das Offizielle Handbuch | ||||
|---|---|---|---|---|
| Zurück | Schnell zurück | Kapitel 34. Server Programming Interface | Schnell nach vorne | Nach vorne |
PostgreSQL verwaltet allen dynamisch zugeteilten Speicher in Speicherkontexten. Damit lassen sich Speichersegmente, die an vielen verschiedenen Stellen zugeteilt wurden und unterschiedlich lange leben müssen, einfach verwalten. Wenn ein Kontext gelöscht wird, dann wird aller darin enthaltener Speicher freigegeben. Daher muss man sich nicht die einzelnen Objekte merken um Speicherlecks zu vermeiden, sondern es müssen nur einige wenige Speicherkontexte verwaltet werden. palloc und verwandte Funktionen teilen Speicher im „aktuellen“ Kontext zu.
SPI_connect erzeugt einen neuen Speicherkontext und macht ihn zum aktuellen. SPI_finish löscht den von SPI_connect erzeugten Speicherkontext und stellt den vorher aktiven wieder her. Damit wird sichergestellt, dass aller Speicher, der in ihren Prozeduren zugeteilt wird, am Ende der Prozedur freigegeben wird und somit Speicherlecks vermieden werden.
Wenn ihre Prozedur jedoch ein Objekt im zugeteilten Speicher aus der Prozedur zurückgeben möchte (zum Beispiel einen Wert eines Datentyps mit Referenzübergabe), dann können Sie diesen Speicher nicht mit palloc zuteilen, zumindest nicht so lange Sie mit SPI verbunden sind. Wenn Sie es versuchen, dann wird ihr Objekt von SPI_finish wieder freigegeben und ihre Prozedur wird nicht verlässlich funktionieren. Um dieses Problem zu lösen, verwenden Sie SPI_palloc um Speicher für das zurückzugebende Objekt zu erhalten. SPI_palloc teilt Speicher aus dem „übergeordneten Executor-Kontext“ zu, das heißt, aus dem Speicherkontext, der vor dem Aufruf von SPI_connect aktuell war, was genau der richtige Kontext ist um aus Ihrer Prozedur einen Wert zurückzugeben.
Wenn SPI_palloc aufgerufen wird, während die Prozedur nicht mit SPI verbunden ist, dann verhält es sich wie ein normales palloc. Bevor eine Prozedur mit dem SPI-Manager verbindet, ist also der übergeordnete Executor-Kontext der aktuelle Speicherkontext und der von palloc oder SPI-Unterstützungsfunktionen zugeteilte Speicher wird in diesem Kontext angelegt.
Wenn SPI_connect aufgerufen wird, dann wird der private Kontext der Prozedur, der von SPI_connect erzeugt wurde, zum aktuellen Kontext. Aller Speicher, der von palloc, repalloc oder SPI-Unterstützungsfunktionen (außer SPI_copytuple, SPI_copytupledesc, SPI_copytupleintoslot, SPI_modifytuple und SPI_palloc) zugeteilt wird, wird in diesem Kontext angelegt. Wenn eine Prozedur die Verbindung mit dem SPI-Manager beendet (mit SPI_finish), dann wird der übergeordnete Executor-Kontext wieder zum aktuellen Kontext und der im Speicherkontext der Prozedur angelegte Speicher wird freigegeben und kann nicht mehr verwendet werden.
Alle in diesem Abschnitt beschriebenen Funktionen können in verbundenen und in nicht verbundenen Prozeduren verwendet werden. In einer nicht verbundenen Prozedur verhalten sie sich genauso wie die ihnen zugrundeliegenden normalen Serverfunktionen (palloc usw.).
| Zurück | Zum Anfang | Nach vorne |
| SPI_getrelname | Nach oben | SPI_palloc |