Hallo zusammen!
In unserer Firma haben wir seit kurzem eine Anbindung an Postgresql. Beim Monitoring mit PGAdmin III sehe ich eine Menge <IDLE> in Transaction Prozesse, nach etwas Recherche konnte ich das Problem eingrenzen und habe festgestellt, dass dieses Problem nur SELECT-Statements und keine schreibenden Zugriffe betrifft (Postgresql startet wohl für SELECTS auch eine Transaktion, die wir dann aber nicht mit einem commit() oder rollback() beenden).
Meine Frage nun: Hat das irgendwelche negativen Auswirkungen auf unsere Anwendung oder die Datenbank? Und gibt es eine Möglichkeit, dieses Verhalten abzuschalten, das bei lesenden Zugriffen Transaktionen gestartet werden?
Vielen Dank im Vorraus!
--
https://www.xing.com/profile/Andreas_Kretschmer7ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
Commit anhängen wäre bei dem Umfang unserer Software vom Aufwand nicht vertretbar, da wir dann hunderte Codestellen anpassen müssten und anschließend testen. Gibt es denn da keine andere Möglichkeit? Unsere Software läuft beim Kunden seit Jahren mit Oracle, MS SQL und DB2, daher versteh ich den Sinn nicht ganz, einen SELECT-Befehl in einer Transaktion auszuführen. Wegen dem Resultset: Ich schließe ja das Statement, dadurch wird auch der Speicher für das Resultset freigegeben.
Doch, commit(). Da das Kommando aus JAVA heraus abgesetzt wird![]()
Geändert von InstantCoffee (12.01.2010 um 17:52 Uhr)
Welche Einstellung hat Autocommit in der Software?
Xandrian: Kurz gesagt: Du hast ein falsches Konzept und willst nicht auf ads hören
Jetzt NEU: PostgreSQL - Datenbankpraxis für Anwender, Administratoren und Entwickler
PostgreSQL Service & Support
Xandrian: Kurz gesagt: Du hast ein falsches Konzept und willst nicht auf ads hören
Jetzt NEU: PostgreSQL - Datenbankpraxis für Anwender, Administratoren und Entwickler
PostgreSQL Service & Support
Mir ist die Logik nicht ganz klar. Warum wird bei Autocommit=FALSE eine neue Transaktion gestartet? Was würde das z.B. bedeuten, wenn ich beispielsweise drei DML-Operationen auf mehreren Tabellen in einer Transaktion durchführen möchte? Bisher sieht unser Code in etwa so aus:
<code>
conn = getConnectionFromPool();
Statement s = conn.createStatement();
s.execute("INSERT INTO Tabelle1......");
s.close();
s = conn.createStatement();
s.execute("UPDATE Tabelle2......");
s.close();
s = conn.createStatement();
s.execute("INSERT Tabelle3......");
s.close();
conn.commit();
</code>
Was müsste ich nun ändern, damit ich diese Offenen Transaktionen loswerde? Autocommit darf ja während dieser Transaktion auf KEINEN FALL auf false stehen, da die Operation auf den drei Tabellen atomar bleiben muss.
Du könntest AutoCommit auf true stellen, dann wird jede Operation in seiner eigenen Transaktion durchgeführt.
Wenn du mehrere Operationen in eine Transaktion zusammenfassen willst, kannst du explizit eine (länger laufende) Transaktion mit BEGIN oder START TRANSACTION starten.
Dann sind offene Verbindungen im Regelfall nicht in einer laufenden Transaktion.
Xandrian: Kurz gesagt: Du hast ein falsches Konzept und willst nicht auf ads hören
Jetzt NEU: PostgreSQL - Datenbankpraxis für Anwender, Administratoren und Entwickler
PostgreSQL Service & Support
Ich hab das ganze mal mit einem Java-Testprogramm probiert. Mit Autocommit = FALSE bekomme ich keine Offene Transaktion (da ich hier das commit selber im Code setze). Lediglich bei einem SELECT passiert das (weil ich am Ende weder commit() noch rollback() aufrufe). Ich müsste also wahrscheinlich dem Connection-Pool nur sagen, dass er am Ende nochmal ein Commit ausführen soll, oder?
Eher der Anwendung, nicht dem Pool. Es ist nicht Aufgabe des Pools, ungefragt Änderungen zu committen.
Wenn die Anwendung das nicht tut, woher weißt du, ob die Änderungen wirklich "durch" sind oder ob es zu einem Abbruch aufgrund eines Fehlers kam?
Xandrian: Kurz gesagt: Du hast ein falsches Konzept und willst nicht auf ads hören
Jetzt NEU: PostgreSQL - Datenbankpraxis für Anwender, Administratoren und Entwickler
PostgreSQL Service & Support
Links: Tobias Bauer - IT- und Funkdienstleistungen - Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen - Funkforum
Lesezeichen