Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 12

Thema: Problem mit <IDLE> in transaction

  1. #1
    InstantCoffee ist offline Neuer Benutzer
    Registriert seit
    12.01.2010
    Beiträge
    18

    Standard Problem mit <IDLE> in transaction

    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!

  2. #2
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Dresden
    Beiträge
    5.465

    Standard

    Zitat Zitat von InstantCoffee Beitrag anzeigen
    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!
    Jein. Natürlich wird für das Resultset eines Selects irgendwo Speicher verbraucht. Abschalten? Ein COMMIT anhängen?

    Ach ja: COMMIT, nicht COMMIT().

    Andreas
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  3. #3
    InstantCoffee ist offline Neuer Benutzer
    Registriert seit
    12.01.2010
    Beiträge
    18

    Standard

    Zitat Zitat von akretschmer Beitrag anzeigen
    Jein. Natürlich wird für das Resultset eines Selects irgendwo Speicher verbraucht. Abschalten? Ein COMMIT anhängen?
    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.

    Zitat Zitat von akretschmer Beitrag anzeigen
    Ach ja: COMMIT, nicht COMMIT().
    Andreas
    Doch, commit(). Da das Kommando aus JAVA heraus abgesetzt wird
    Geändert von InstantCoffee (12.01.2010 um 17:52 Uhr)

  4. #4
    ads
    ads ist offline Super-Moderator
    Registriert seit
    08.02.2006
    Ort
    MD
    Beiträge
    4.055

    Standard

    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

  5. #5
    InstantCoffee ist offline Neuer Benutzer
    Registriert seit
    12.01.2010
    Beiträge
    18

    Standard

    Zitat Zitat von ads Beitrag anzeigen
    Welche Einstellung hat Autocommit in der Software?
    Hi,

    Autocommit ist auf false.

  6. #6
    ads
    ads ist offline Super-Moderator
    Registriert seit
    08.02.2006
    Ort
    MD
    Beiträge
    4.055

    Standard

    Zitat Zitat von InstantCoffee Beitrag anzeigen
    Autocommit ist auf false.
    Dann wird nach einem COMMIT eine neue Transaktion gestartet und die bleibt wiederum offen, bis sie committed oder zurückgerollt wird.

    Die Verbindung befindet sich quasi immer in einer Transaktion.

    Daher dürfte auch deine Anzeige kommen.
    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

  7. #7
    InstantCoffee ist offline Neuer Benutzer
    Registriert seit
    12.01.2010
    Beiträge
    18

    Standard

    Zitat Zitat von ads Beitrag anzeigen
    Dann wird nach einem COMMIT eine neue Transaktion gestartet und die bleibt wiederum offen, bis sie committed oder zurückgerollt wird.

    Die Verbindung befindet sich quasi immer in einer Transaktion.

    Daher dürfte auch deine Anzeige kommen.
    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.

  8. #8
    ads
    ads ist offline Super-Moderator
    Registriert seit
    08.02.2006
    Ort
    MD
    Beiträge
    4.055

    Standard

    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

  9. #9
    InstantCoffee ist offline Neuer Benutzer
    Registriert seit
    12.01.2010
    Beiträge
    18

    Standard

    Zitat Zitat von ads Beitrag anzeigen
    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.
    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?

  10. #10
    ads
    ads ist offline Super-Moderator
    Registriert seit
    08.02.2006
    Ort
    MD
    Beiträge
    4.055

    Standard

    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

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. Frage Transaction JDBC Postgresql 8.X
    Von seawolf im Forum Programmierung
    Antworten: 2
    Letzter Beitrag: 09.12.2010, 11:46
  2. JDBC & DB Transaction für parallele Applikationen
    Von myklynysh im Forum externe Schnittstellen
    Antworten: 7
    Letzter Beitrag: 21.01.2010, 17:27
  3. in laufende Transaction reinschauen
    Von Sigh im Forum Allgemeines
    Antworten: 6
    Letzter Beitrag: 27.11.2008, 13:06
  4. Analog zu AUTONOMOUS TRANSACTION
    Von petra im Forum PL/pgSQL
    Antworten: 9
    Letzter Beitrag: 17.10.2007, 12:15
  5. Transaction Timeout
    Von johanna im Forum Programmierung
    Antworten: 1
    Letzter Beitrag: 11.07.2007, 13:01

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Links: Tobias Bauer - IT- und Funkdienstleistungen   -   Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen   -   Funkforum