[IT] Spezifikationen und Implementierungen (oder: JDBC und Oracle)
Tom DeMarco schreibt in seinem Buch "Der Termin":
"Nicht das, was wir nicht wissen, bringt uns zu Fall... sondern das, was wir fälschlicherweise zu wissen glauben."
Und er hat Recht damit - erst kürzlich wurde mir das wieder bewusst, nachdem ich erfahren hatte, dass der JDBC-Treiber von Oracle (zumindest einige Versionen davon) die JDBC-Spezifikationen nicht überall einhalten.
An folgende Spezifikation hält sich Oracle z.B. nicht, die Methode java.sql.Statement#close() betreffend:
"When a Statement object is closed, its current ResultSet object, if one exists, is also closed."
Ohne dies zu wissen, habe ich mich auf die Spezifikation von JDBC verlassen und in meinem Code immer schön sichergestellt, dass alle Statements geschlossen werden. Ein explizites Schließen der ResultSets hielt ich nicht für nötig (und ließ es daher auch stets weg).
Zu viele offene ResultSet-Objekte können einen Fehler "Too many open cursors" in der Datenbank auslösen. Daher wunderte ich mich, wieso ich dieses Problem dann noch nicht gehabt hatte.
Ein Blick in den Sourcecode vom von mir verwendeten DB-Connection-Pool (Jakarta Commons DBC) verriet mir, dass dieser sich wiederum an die oben beschriebene Spezifikation hält! Da dieser Pool nicht direkt die Connection-, Statement- und ResultSet-Klassen von Oracle nutzt, sondern nochmals Wrapper drumherum macht, ist es ihm ein Leichtes, beim Schließen der Statements auch deren ResultSets zu schließen. Das war der Grund, weshalb dieser Fehler bei mir nie aufgetreten ist!!
Glück gehabt...
"Nicht das, was wir nicht wissen, bringt uns zu Fall... sondern das, was wir fälschlicherweise zu wissen glauben."
Und er hat Recht damit - erst kürzlich wurde mir das wieder bewusst, nachdem ich erfahren hatte, dass der JDBC-Treiber von Oracle (zumindest einige Versionen davon) die JDBC-Spezifikationen nicht überall einhalten.
An folgende Spezifikation hält sich Oracle z.B. nicht, die Methode java.sql.Statement#close() betreffend:
"When a Statement object is closed, its current ResultSet object, if one exists, is also closed."
Ohne dies zu wissen, habe ich mich auf die Spezifikation von JDBC verlassen und in meinem Code immer schön sichergestellt, dass alle Statements geschlossen werden. Ein explizites Schließen der ResultSets hielt ich nicht für nötig (und ließ es daher auch stets weg).
Zu viele offene ResultSet-Objekte können einen Fehler "Too many open cursors" in der Datenbank auslösen. Daher wunderte ich mich, wieso ich dieses Problem dann noch nicht gehabt hatte.
Ein Blick in den Sourcecode vom von mir verwendeten DB-Connection-Pool (Jakarta Commons DBC) verriet mir, dass dieser sich wiederum an die oben beschriebene Spezifikation hält! Da dieser Pool nicht direkt die Connection-, Statement- und ResultSet-Klassen von Oracle nutzt, sondern nochmals Wrapper drumherum macht, ist es ihm ein Leichtes, beim Schließen der Statements auch deren ResultSets zu schließen. Das war der Grund, weshalb dieser Fehler bei mir nie aufgetreten ist!!
Glück gehabt...

0 Comments:
Kommentar veröffentlichen
<< Home