ich habe ein kleines Problem. Ich schreibe eine Software, die die C-Schnittstelle von PostgreSQL benutzt und per C++ geschrieben wird.
Beim Start des Programms wird eine Verbindung zu einem Datenbankserver aufgebaut und eine Tabelle ausgelesen. Das funktioniert auch einwandfrei. Innerhalb der Tabelle stehen Verbindungsdaten zu anderen Datenbankservern mit unterschiedlichen Zugängen. Derzeit verweisen alle auf den selben (bereits verbundenen). Wird eine zweite Verbindung aufgebaut und kommt diese zu Stande, raucht mir das ganze Programm ab.
Ich habe jetzt etliches ausprobiert, PostgreSQL 8.0, 8.2, DLLs an verschiedeen Stellen, aber ich vermute, dass die libpq nur in der Lage ist, eine gleichzeitige Verbindung pro Speicherbereich zu erstellen. Leider muss ich aber etliche Verbindungen aufbauen. Lasse ich die Zusatzverbindungen weg und baue nur die zur Hauptdatenbank auf und rufe dann die Software mehrfach auf, scheint das auch problemlos zu gehen (ich hatte schon gedacht, dass unter Windows kein Portsharing möglich wäre).
Hier noch ein paar Infos:
PostgreSQL-Server 8.0 auf FreeBSD
PostgreSQL-Libs für Windows (8.0 und 8.2 probiert)
Wie wäre es, wenn du zuerst einmal die kritischen Stellen deines Programms hier postest (über dem Eingabefeld gibt es einen Button für CODE). Als zweites: was hast du bisher unternommen, um den Fehler einzugrenzen? Hast du einen Debugger eingesetzt oder dir ggf. an diversen Stellen ausgeben lassen, welche Variablen welche Werte haben?
Ich erkläre den Mitarbeitern hier auch immer, daß Computer mit Rauch funktionieren. Tritt dieser aus, dann sind die Dinger kapott.
Spaß beiseite: definiere ‘abrauchen’. Das ist keine klare Fehlerbeschreibung.
Ich habe jetzt etliches ausprobiert, PostgreSQL 8.0, 8.2, DLLs an verschiedeen Stellen, aber ich vermute, dass die libpq nur in der Lage ist, eine gleichzeitige Verbindung pro Speicherbereich zu erstellen. Leider muss ich aber etliche Verbindungen aufbauen. Lasse ich die Zusatzverbindungen weg und baue nur die zur Hauptdatenbank auf und rufe dann die Software mehrfach auf, scheint das auch problemlos zu gehen (ich hatte schon gedacht, dass unter Windows kein Portsharing möglich wäre).
Ist es auch nicht. Auch nicht unter Linux. ‘Portsharing’ gibt es nicht. Eine IP-Verbindung ist durch 5 Dinge beschrieben: Quell-IP, Ziel-IP, Quell-Port, Ziel-Port, Protokoll (bei TCP immer 6).
In Deinem Falle teilen sich die Verbindungen NICHT einen gemeinsammen Quellport. Weder unter Linux, noch unter Windoze. Der PG-Server startet allerdings für jede Verbindung einen eigenen Prozess. Aus Client-Sicht brauchst Du nur dafür zu sorgen, daß jede Verbindung einen eigenen Verbindungs-Handle besitzt. Ob das in C oder PHP oder sonstwie erfolgt ist dabei Wurscht.
Hier noch ein paar Infos:
Stück Quelltext, wo der Rauch rauskommt, wäre besser.
Vielen Dank schonmal für die recht konstruktiven Antworten. Ich möchte meine Frage einfach einmal genau beschränken: Gibt es irgendwelche bekannten Probleme mit der libpq, die bei mehreren Verbindungen in einem Programm zu einem Segmentation Fault führen? Ein Ja oder Nein reicht mir absolut aus, um meinen Fehler einzugrenzen.
Da wir dir geholfen haben, wie wäre es, wenn du das Problem hier noch etwas genauer (mit Code Beispiel) beschreibst und auch die Lösung postest?
Dann haben andere auch etwas davon.
Würde ich machen, allerdings hat die Lösung 1. überhaupt nichts mit PostgreSQL zu tun, sondern liegt an der Zuweisung eines Zeigers in einer meiner Klassen, die unglücklicherweise vor dem Absturz geladen wird und nur in der Konstellation auftritt und 2. der Code blöderweise der Firma hier gehört und ich den (das wären etliche hundert Zeilen) nicht posten darf. Mal ganz davon abgesehen, dass der Fehler noch nicht korrigiert ist (: … das mache ich erst später…
Ach, für die, die es doch noch interessiert: der Index von einem Array war Out of Range, was die Auswirkungen auf PostgreSQL mehr oder minder hatte. Absolut meine Blödheit.