Wenn es ein Wartungsfenster gibt, ändern wir die Zuschüsse unserer Anwendung Benutzer zu schreibgeschützt. Nachdem wir unsere Plattform (nach der Wartung) neu gestartet haben, haben wir die Grants zurückgestellt, aber alle bestehenden Verbindungen haben immer noch den Read-Only-Modus. Gibt es eine Möglichkeit, meine Verbindungen zurückzusetzen, ohne meine Plattform neu zu starten oder meine aktiven Sitzungen verloren zu haben?Oracle DB, Live-Verbindungen zurücksetzen nach Änderung der Benutzer gewährt
Antwort
Wenn Ihre Anwendung den Verbindungspool verwendet und in der Lage ist, fehlerhafte Verbindungen zu erkennen, führen Sie auf der Oracle-Seite alle Pool-Sitzungen nach der Änderung der Rechte einfach aus.
Dazu müssen Sie in der Lage sein, "ALTER SYSTEM KILL SESSION" in einer separaten Verbindung auszuführen, die nicht aus diesem Verbindungspool zugewiesen wurde. Sie müssen auch eine SQL-Abfrage erstellen, um SID, SERIAL # -Paare für exakte Sitzungen Ihrer Anwendung zu finden.
Wenn der Verbindungs-Pooling-Layer in Ihrer App gut genug geschrieben ist, erkennt er jede unterbrochene Verbindung und öffnet eine neue, jetzt mit neuen Rechten. Es empfiehlt sich, den Parameter IMMEDIATE nicht zu verwenden, um die Datenkonsistenz für Ihre Anwendung zu bewahren und Fehler zu vermeiden. Das wird einige Zeit dauern, bis aktive Transaktionen abgeschlossen sind. Wenn Ihre Anwendung lange Transaktionen durchführt und Sie nicht zu lange warten können, können Sie den Parameter IMMEDIATE verwenden.
ALTER SYSTEM KILL SESSION 'sid,serial#' [IMMEDIATE];
In Oracle Online-Dokumentation finden Sie, wie Sie Sitzungen finden, die zu Ihrer Anwendung gehören.
Am Ende des Tages habe ich die gelöst Problem mit Hikari in Kombination mit Aspects Leider können wir keine Konfiguration der DB berühren, die Lösung muss in der Anwendungssite sein, danke – elopez
Gut zu hören, dass Sie es gelöst haben. Es gibt eine andere Option, Sie können die Verbindung aller Poolverbindungen in der Anwendung irgendwie erzwingen oder Pool neu starten, aber ich nehme an, dass Sie genau das getan haben, um es zu lösen. – BJovke
Mit Reflection werte ich alle Verbindungen in Hikari aus, um zu entscheiden, welche live und welche ... und mit Aspects alle Anrufe zu den DAOs abfalle, die noch nicht abgeschlossen sind. – elopez
Mit einem Java-Proxy über meine JdbcTemplate in Kombination mit Reflektion, breche ich die Hikari-Komponenten, um den Stapel von Verbindungen zu extrahieren.
Jede Verbindung hat ein creationTime-Feld, das mir hilft zu entscheiden, ob ich die Verbindung beenden will oder nicht, grundsätzlich ist jede Verbindung älter als 5 min ein Kandidat zum sterben.
Java-Proxy ist nur die besondere Ausnahme "ORA-01031" zu fangen, ist der einzige Fall, wenn ich die Räumungskomponente nicht nennen kann.
Sind die Berechtigungen für den Anwendungsbenutzer über eine Rolle oder direkt an den Anwendungsbenutzer vergeben? – ivanzg
Nach Rollen entfernen sie im Prinzip die Rollen write/update und nach der Wartung rollen sie wieder auf den vollständigen Rollensatz um. – elopez
Können Sie überprüfen, ob die Rollen aktiviert sind, nachdem Sie die Data Dictionary-Ansicht abgefragt haben "DBA_ROLE_PRIVS" Spalte "DEFAULT_ROLE" für den Anwendungsbenutzer. – ivanzg