Pratiche di programmazione

Utilizzare le procedure di programmazione riportate di seguito.

Usa pacchetti strumentazione

Oracle Database fornisce pacchetti di strumentazione i cui sottoprogrammi consentono all'applicazione di generare informazioni di traccia quando necessario. Utilizzando queste informazioni di trace, è possibile eseguire il debug dell'applicazione senza un debugger e identificare il codice che si comporta male.

La strumentazione fornisce alla tua applicazione una notevole funzionalità; quindi, non è sovraccarico. Overhead è qualcosa che si può rimuovere senza perdere molto beneficio.

Oracle Database fornisce i seguenti pacchetti di strumentazione:

Vedere anche: Oracle Database PL/SQL Packages and Types Reference per un riepilogo dei package PL/SQL forniti da Oracle Database

Raccolta statistiche e trace applicazione

Le statistiche del database forniscono informazioni circa il tipo di carico sul database e le risorse interne ed esterne utilizzate dal database. Per diagnosticare accuratamente i problemi di prestazioni del database utilizzando ADDM, è necessario che siano disponibili le statistiche.

Per informazioni sulla raccolta delle statistiche, vedere Oracle Database 2 Day + Performance Tuning Guide.

Nota: se Oracle Enterprise Manager non è disponibile, è possibile raccogliere le statistiche utilizzando i programmi secondari DBMS_MONITOR, descritti in Oracle Database PL/SQL Packages and Types Reference.

Oracle Database fornisce diversi strumenti di trace che consentono di monitorare e analizzare le applicazioni Oracle Database. Per informazioni dettagliate, vedere Oracle Database SQL Tuning Guide.

Usa funzionalità esistente

Un'applicazione che utilizza funzionalità esistenti è più facile da sviluppare e gestire di una che non lo fa, e funziona anche più velocemente.

Quando sviluppi la tua applicazione, utilizza le funzionalità esistenti del tuo linguaggio di programmazione, del tuo sistema operativo, di Oracle Database, dei pacchetti e dei tipi PL/SQL che Oracle Database fornisce il più possibile.

Esempi di funzionalità esistenti che molti sviluppatori reinventano includono le seguenti funzioni:

In Esempio 8-4, due transazioni concorrenti rimuovono dalla coda i messaggi memorizzati in una tabella, ovvero ogni transazione trova e blocca la riga successiva non elaborata della tabella. Invece di richiamare semplicemente la procedura DBMS_AQ.DEQUEUE (descritta in Oracle Database PL/SQL Packages and Types Reference), l'esempio crea un indice basato su funzioni nella tabella e quindi utilizza tale funzione in ogni transazione per recuperare le righe e visualizzare i messaggi.

Il codice nell'Esempio 8-4 implementa una funzione simile a un richiamo DBMS_AQ.DEQUEUE, ma con meno funzionalità. Il tempo di sviluppo risparmiato utilizzando la funzionalità esistente (in questo caso, gli indici basati sulle funzioni) può essere elevato.

Esempio 8-4 transazioni di rimozione dalla coda concorrenti

Crea tabella:

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

Crea indice per la tabella:

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

Inserisci dati nella tabella:

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);

Mostra tabella:

SELECT * FROM t;

Risultato:

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.

Prima operazione:

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;
/

Risultato:

Got row 2, payload 2

Transazione concorrente:

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;
/

Risultato:

Got row 4, payload 4

Vedere anche:

Copri tabelle database con viste di edizione

Se l'applicazione utilizza tabelle di database, coprire ciascuna di esse con una vista di edizione in modo da poter utilizzare la ridefinizione basata su edizioni (EBR) per aggiornare il componente di database dell'applicazione mentre è in uso, riducendo al minimo o eliminando i tempi di inattività.

Per informazioni sulla ridefinizione basata sull'edizione, vedere Oracle Database Development Guide.