Programmierpraktiken

Verwenden Sie die folgenden Programmierverfahren.

Instrumentierungspakete verwenden

Oracle Database stellt Instrumentierungspackages bereit, deren Unterprogramme die Anwendung bei Bedarf Trace-Informationen generieren lassen. Mit diesen Trace-Informationen können Sie Ihre Anwendung ohne Debugger debuggen und Code identifizieren, der schlecht funktioniert.

Instrumentierung bietet Ihrer Anwendung eine beträchtliche Funktionalität; daher ist es kein Overhead. Overhead ist etwas, das Sie entfernen können, ohne viel Nutzen zu verlieren.

Die folgenden Instrumentierungspackages werden von Oracle Database bereitgestellt:

Siehe auch: Oracle Database PL/SQL Packages and Types Reference für eine Zusammenfassung der PL/SQL-Packages, die Oracle Database bereitstellt

Statistiksammlung und Anwendungs-Tracing

Datenbankstatistiken bieten Informationen über den Lasttyp in der Datenbank und die von der Datenbank verwendeten internen und externen Ressourcen. Um Performanceprobleme mit der Datenbank mithilfe von ADDM genau diagnostizieren zu können, müssen Statistiken verfügbar sein.

Informationen zur Erfassung von Statistiken finden Sie in der Dokumentation Oracle Database 2 Day + Performance Tuning Guide.

Hinweis: Wenn Oracle Enterprise Manager nicht verfügbar ist, können Sie Statistiken mit DBMS_MONITOR-Unterprogrammen erfassen, die in der Oracle Database PL/SQL Packages and Types Reference beschrieben werden.

Oracle Database bietet mehrere Tracing-Tools, mit denen Sie Oracle Database-Anwendungen überwachen und analysieren können. Einzelheiten finden Sie in der Dokumentation SQL Tuning für Oracle Database.

Vorhandene Funktionen verwenden

Eine Anwendung, die vorhandene Funktionen verwendet, ist einfacher zu entwickeln und zu warten als eine Anwendung, die dies nicht tut, und sie wird auch schneller ausgeführt.

Verwenden Sie bei der Entwicklung Ihrer Anwendung die vorhandene Funktionalität Ihrer Programmiersprache, Ihres Betriebssystems, der Oracle Database und der PL/SQL-Packages und -Typen, die Oracle Database so weit wie möglich bereitstellt.

Beispiele für vorhandene Funktionen, die viele Entwickler neu erfinden, sind die folgenden Funktionen:

In Beispiel 8-4 entpacken zwei nebenläufige Transaktionen Nachrichten, die in einer Tabelle gespeichert sind (d.h. jede Transaktion findet und sperrt die nächste nicht verarbeitete Zeile der Tabelle). Anstatt einfach die Prozedur DBMS_AQ.DEQUEUE aufzurufen (in Oracle Database PL/SQL Packages and Types Reference beschrieben), erstellt das Beispiel einen funktionsbasierten Index für die Tabelle und verwendet diese Funktion dann in jeder Transaktion, um die Zeilen abzurufen und die Nachrichten anzuzeigen.

Der Code in Beispiel 8-4 implementiert ein Feature, das einem DBMS_AQ.DEQUEUE-Aufruf ähnelt, jedoch weniger Funktionen aufweist. Die durch die Verwendung vorhandener Funktionen eingesparte Entwicklungszeit (in diesem Fall funktionsbasierte Indizes) kann groß sein.

Beispiel 8-4: Gleichzeitige Dequeuing-Transaktionen

Tabelle erstellen:

DROP TABLE t;
CREATE TABLE t
  ( id             NUMBER PRIMARY KEY,
    processed_flag VARCHAR2(1),
    payload        VARCHAR2(20)
  );

Index in Tabelle erstellen:

CREATE INDEX t_idx ON
  t( DECODE( processed_flag, 'N', 'N' ) );

Tabelle ausfüllen:

INSERT INTO t
  SELECT r,
         CASE WHEN MOD(r,2) = 0 THEN 'N' ELSE 'Y' END,
         'payload ' || r
  FROM (SELECT LEVEL r FROM DUAL CONNECT BY LEVEL <= 5);

Tabelle anzeigen:

SELECT * FROM t;

Ergebnis:

ID P PAYLOAD
---------- - --------------------
         1 Y payload 1
         2 N payload 2
         3 Y payload 3
         4 N payload 4
         5 Y payload 5

5 rows selected.

Erste Transaktionen:

DECLARE
  l_rec t%ROWTYPE;
  CURSOR c IS
    SELECT *
    FROM t
    WHERE DECODE(processed_flag,'N','N') = 'N'
    FOR UPDATE
    SKIP LOCKED;
BEGIN
  OPEN c;

  FETCH c INTO l_rec;

  IF ( c%FOUND ) THEN
    DBMS_OUTPUT.PUT_LINE( 'Got row ' || l_rec.id || ', ' || l_rec.payload );
  END IF;

  CLOSE c;
END;
/

Ergebnis:

Got row 2, payload 2

Hintergrundtransaktion:

DECLARE
  PRAGMA AUTONOMOUS_TRANSACTION;
  l_rec t%ROWTYPE;
  CURSOR c IS
    SELECT *
    FROM t
    WHERE DECODE(processed_flag,'N','N') = 'N'
    FOR UPDATE
    SKIP LOCKED;
BEGIN
  OPEN c;

  FETCH c INTO l_rec;

  IF ( c%FOUND ) THEN
    DBMS_OUTPUT.PUT_LINE( 'Got row ' || l_rec.id || ', ' || l_rec.payload );
  END IF;

  CLOSE c;
  COMMIT;
END;
/

Ergebnis:

Got row 4, payload 4

Siehe:

Datenbanktabellen mit Editionsansichten abdecken

Wenn Ihre Anwendung Datenbanktabellen verwendet, decken Sie jede Datenbanktabelle mit einer Editionsansicht ab, sodass Sie die Datenbankkomponente Ihrer Anwendung mit einer Editions-basierten Neudefinition (EBR) aktualisieren können, während sie verwendet wird. Dadurch wird die Ausfallzeit minimiert oder eliminiert.

Informationen zur Editions-basierten Neudefinition finden Sie im Oracle Database Development Guide.