Create Database mit Template: Datenbank wird von anderem Benutzer verwendet

Hallo zusammen,

ich möchte mit meinem Tool eine neue PG-Datenbank auf Basis einer anderen Datenbank erzeugen. Dabei meckert der Server, dass die Datenbank, welche ich als Template angegeben habe, von einem anderen Benutzer verwendet wird. Das liegt offenbar an meinem Tool selber, welcher vorher alle vorhandenen Datenbanken ausliest und in bestimmte Tabellen reinguckt. Der pgAdmin zeigt mir anschließend tatsächlich Sessions, welche aber alle “idle” sind. Wenn ich über den “pgAdmin” die Sessions zur verwendeten Template-Datenbank lösche, kann ich sie auch als Template verwenden.

Kann ich nur auch automatisch die Sessions löschen? Gibt es da einen SQL-Befehl dafür?

Warum bleibt sowas überhaupt übrig? Ich greife per C#-Code auf die Datenbanktabellen zu, dabei jeweils eine “Connection” geöffnet, ein “SQL-Command” abgesetzt (SELECT …) und anschließend wird die “Connection” wieder geschlossen.
Gruß, Karsten.

offenbar schließt Du oder Dein Tool die Session nicht wirklich…

Hm, soweit geht meine Vermutung auch… aber was fehlt noch?

Ich mache eigentlich nur 3 Schritte:

  • Öffnen einer Verbindung: PgSqlConnection.Open()
  • Ausführen eines beliebigen Commands: PgSqlCommand.ExecuteNonQuery(…)
  • Schließen der Verbindung: PgSqlConnection.Close()

Vermutlich hast Du noch irgendwo ein SQL Tool (psql, pgAdmin, DBeaver, …) offen welches eine Verbindung hält.

Der pgAdmin ist offen, ja, aber dort achte ich darauf, dass ich nicht mit der betreffenden Datenbank verbunden bin. Von da aus könnte ich auch die betreffenden Sessions löschen, danach würde das CREATE … auch gehen. Das ist irgendwas in meinem Code…

Ich habe mich jetzt mit dem Code rund um “select pg_terminate_backend” und kann damit direkt vor dem CREATE… oder auch DROP… die Sessions zur betroffenen Datenbank beenden. Das ist für mich aber nur die zweitbeste Lösung. Mich würde echt gerne interessieren, warum eine Session offenbleibt.

Schließ doch mal pgAdmin komplett, bevor Du Dein Programm laufen lässt

Hatte ich schon getestet, sorry, habs vergessen zu schreiben. Das ist es leider auch nicht. Der pgAdmin zeigt sich auch klar in der Spalte “Application” in den Sessions. Die anderen Session haben keine “Application”.

Also eine kleine Erkenntnis gibt es: Wenn ich im C#-Code nach dem “Close()” meiner Connection noch ein “PgSqlconnection.ClearPool(…)” nachschiebe, dann sehen die Session deutlich aufgeräumter aus. Ob das jetzt allerdings eine gute Idee ist, permanent den Pool zu clearen, kann ich so nicht beurteilen. Das ist alles Teil eines großen Webservices, der immer wieder Datenbankfragen aufnimmt und die Daten zurückschickt, d.h. da findet permanent ein “Open - Execute, was auch immer - Close” statt und nun auch noch dauern ein “ClearPool”.

Du hast verschwiegen, dass da ein Connection Pool beteiligt ist.

Sinn und Zweck eines Pools ist es ja gerade, die physischen Verbindungen nicht zu schließen, in der Erwartung, dass sie über kurz oder lang wieder benötigt wird.

Sorry, das war auch keine Absicht. Es war mir nicht bewusst, dass es einen Pool gibt, da ich einfach den Befehl “Open()” einer “PgSqlConnection” verwende.

Ich denke, ich werde das “ClearPool” ausschließlich bei der Datenbank einsetzen, welche ich als Vorlage verwende. Auf die Datenbank wird normalerweise nicht zugegriffen, außer eben durch mein Tool.

Dieses Thema wurde automatisch 60 Tage nach der letzten Antwort geschlossen. Es sind keine neuen Antworten mehr erlaubt.