Pratiques de programmation

Utilisez les pratiques de programmation suivantes.

Utiliser des ensembles d'instrumentation

Oracle Database fournit des packages d'instrumentation dont les sous-programmes permettent à votre application de générer des informations de trace chaque fois que nécessaire. À l'aide de ces informations de trace, vous pouvez déboguer votre application sans débogueur et identifier le code qui fonctionne mal.

L'instrumentation offre à votre application une fonctionnalité considérable; par conséquent, il ne s'agit pas de frais généraux. Les frais généraux sont quelque chose que vous pouvez supprimer sans perdre beaucoup d'avantages.

Les ensembles d'instrumentation suivants sont fournis par Oracle Database :

Voir aussi : Informations de référence sur les ensembles et les types PL/SQL pour Oracle Database pour obtenir un sommaire des ensembles PL/SQL fournis par Oracle Database

Collecte de statistiques et suivi des applications

Les statistiques de base de données fournissent des informations sur le type de chargement de la base de données et sur les ressources internes et externes utilisées par la base. Pour diagnostiquer avec précision les problèmes de performances de la base de données à l'aide du moniteur ADDM, des statistiques doivent être disponibles.

Pour plus d'informations sur la collecte de statistiques, voir Oracle Database 2 Day + Performance Tuning Guide.

Note : Si Oracle Enterprise Manager n'est pas disponible, vous pouvez collecter des statistiques à l'aide des sous-programmes DBMS_MONITOR, décrits dans Informations de référence sur les ensembles et les types PL/SQL pour Oracle Database.

Oracle Database fournit plusieurs outils de traçage qui peuvent vous aider à surveiller et à analyser les applications Oracle Database. Pour plus de détails, voir Guide de réglage SQL pour Oracle Database.

Utiliser les fonctionnalités existantes

Une application qui utilise des fonctionnalités existantes est plus facile à développer et à gérer qu'une autre qui ne le fait pas, et elle s'exécute également plus rapidement.

Lors du développement de votre application, utilisez les fonctionnalités existantes de votre langage de programmation, de votre système d'exploitation, d'Oracle Database et des packages et types PL/SQL fournis par Oracle Database autant que possible.

Les fonctions suivantes sont des exemples de fonctionnalités existantes que de nombreux développeurs réinventent :

Dans l'exemple 8-4, deux transactions concurrentes retirent les messages stockés dans une table (c'est-à-dire que chaque transaction trouve et verrouille la prochaine rangée non traitée de la table). Plutôt que d'appeler simplement la procédure DBMS_AQ.DEQUEUE (décrite dans Informations de référence sur les ensembles et les types PL/SQL pour Oracle Database), l'exemple crée un index basé sur une fonction sur la table, puis utilise cette fonction dans chaque transaction pour extraire les rangées et afficher les messages.

Le code de l'exemple 8-4 met en oeuvre une fonction similaire à un appel DBMS_AQ.DEQUEUE, mais avec moins de capacités. Le temps de développement économisé à l'aide des fonctionnalités existantes (dans ce cas, les index basés sur une fonction) peut être important.

Exemple 8-4 : Transactions concurrentes de mise en file d'attente

Créer une table :

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

Créer un index sur la table :

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

Remplissez la table :

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

Afficher la table :

SELECT * FROM t;

Résultat :

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.

Première transaction :

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

Résultat :

Got row 2, payload 2

Transaction concurrente :

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

Résultat :

Got row 4, payload 4

Voir aussi :

Couvrir des tables de base de données avec des vues d'édition

Si votre application utilise des tables de base de données, recouvrez-les d'une vue d'édition afin que vous puissiez utiliser la redéfinition basée sur l'édition (EBR) pour mettre à niveau le composant de base de données de votre application pendant son utilisation, réduisant ainsi ou éliminant les temps d'arrêt.

Pour plus d'informations sur la redéfinition basée sur l'édition, voir le guide de développement d'Oracle Database.