4 Stimmen

ORA-00036: Maximale Anzahl von rekursiven SQL-Ebenen (50) überschritten, nachdem toplink für die Verwendung von Bindungsvariablen konfiguriert wurde

Ich habe eine Anwendung, die Toplink für die Persistenz und die Oracle-Datenbank verwendet. In letzter Zeit hatte ich Leistungsprobleme, insbesondere auf der Ebene der Datenbank/Abfragen. Ich habe ein großes Stück Logik in einer Reihe von Triggern und gespeicherten Prozeduren, schlecht geschrieben, mit Workarounds für das mutierende Triggerproblem. Die Anwendung ist seit ein paar Jahren in Produktion, und das Umschreiben dieses Codes ist die letzte Lösung, wenn man die Bürokratie der Genehmigung für eine neue Version und andere höhere Prioritäten berücksichtigt. Ich suche also nach einer schnellen Lösung.

Eine Lösung zur Verbesserung der Leistung ist die Verwendung von Bindungsvariablen. Mein Problem ist, dass nach dem Hinzufügen von bind-all-variables und cache-all-statements in sessions.xml in toplink, auf einer bestimmten UI, die den beschissenen Code auslöst, und funktionierte einfach gut, bevor Sie diese Konfigurationsänderung, bekomme ich diesen Fehler:

ORA-00036: Maximale Anzahl von rekursiven SQL-Ebenen (50) überschritten

Meine Fragen sind: Warum wird dieser Fehler nur angezeigt, wenn ich die Einstellung bind-variable hinzufüge? Was kann ich tun, damit es mit Bind-Variablen funktioniert, ohne den beschissenen Code zu ändern?

2voto

Gary Myers Punkte 34373

"mit Workarounds für das Problem des mutierenden Auslösers"

Das klingt beängstigend, denn die meisten dieser Workarounds drehen sich um autonome Transaktionen, die (a) nicht besonders gut funktionieren und (b) wahrscheinlich als rekursives SQL gelten.

Andererseits bedeutet Logik in PL/SQL im Allgemeinen, dass das Problem nicht die Bindungsvariablen sind, da man in PL/SQL große Anstrengungen unternehmen muss, um keine Bindungen zu verwenden.

In diesem Fall würde ich sagen, dass Ihre Zeit besser auf Adressierung/Ersetzen alle mutierenden Tabelle Workarounds mit einer soliden Basis statt binden Variable Fragen ausgegeben wird.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X