Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Verwendet Tomcat zwischengespeicherte Versionen von pl/sql-Modulen?

Dieses Problem tritt bei den JDBC-Verbindungspools auf und tritt bei allen App-Servern auf, die JDBC-Verbindungspools verwenden, nicht nur bei Tomcat. Die Verbindungspools halten eine Anzahl von Verbindungen in dem Pool offen, die für die nächste Anforderung bereit sind. Wenn ein PL/SQL-Paket von der Verbindung referenziert wurde und neu kompiliert wird, löst der nächste Aufruf dieses Pakets einen ORA-06508-Fehler aus. Dies betrifft Pakete überall in der Aufrufliste – nicht nur das Paket, das Sie direkt aufgerufen haben.

Um dies zu beheben, verfügen einige App-Server (wie Weblogic) über eine Testmethode, die regelmäßig aufgerufen wird. Wenn der Test fehlschlägt, wird die Verbindung aus dem Pool entfernt oder auf irgendeine Weise aktualisiert. Ich bin mir nicht sicher, welchen Mechanismus Tomcat hat.

Eine andere Möglichkeit, dies zu beheben, besteht darin, dbms_session.reset_package als ersten Methodenaufruf in Ihrem JDBC-Aufruf aufzurufen. Dadurch wird der Paketstatus aus Ihrer Sitzung gelöscht. Dieser Ansatz wird nicht empfohlen, da er einen Performance-Overhead hat und alle paketbezogenen Variablen zurückgesetzt werden, sodass Paketinitialisierungsblöcke erneut aufgerufen werden müssen – ein weiterer Performance-Hit.

Wenn Sie das Problem haben und keine Möglichkeit haben, schlechte Verbindungen zu löschen, müssen Sie den gesamten Verbindungspool zurücksetzen, da jede Verbindung im Pool unter der gleichen Ausnahme leiden wird.