プログラミング・プラクティス
次のプログラミング方法を使用します。
インスツルメンテーション・パッケージの使用
Oracle Databaseにはインスツルメンテーション・パッケージが用意されており、このパッケージに含まれるサブプログラムを使用して、必要なときにいつでもアプリケーション・トレース情報を生成できます。このトレース情報を使用すると、デバッガを使用せずにアプリケーションをデバッグでき不正なコードを特定できます。
インスツルメンテーションは、アプリケーションに多数の機能を提供しているため、オーバーヘッドではありません。オーバーヘッドは、多くの利点を失わずに削除できる部分です。
Oracle Databaseでは、次のインストゥルメンテーション・パッケージが提供されます。
-
DBMS_APPLICATION_INFOを使用すると、システム管理者は、アプリケーションのパフォーマンスをモジュール別に追跡することができます。
DBMS_APPLICATION_INFOの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』に関する項を参照してください。
-
DBMS_SESSIONを使用すると、アプリケーションがセッション情報にアクセスし、「プリファレンス」および「セキュリティ・レベル」を設定できます。
DBMS_SESSIONの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』に関する項を参照してください。
-
UTL_FILE: アプリケーションがオペレーティング・システムのテキスト・ファイルを読取りおよび書込みできるようにします。
UTL_FILEの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。
関連項目: Oracle Databaseが提供するPL/SQLパッケージの概要は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照
統計の収集およびアプリケーション・トレース
データベース統計ではデータベースの負荷のタイプ、およびデータベースで使用する内部および外部リソースに関する情報が提供されます。ADDMを使用したデータベースでパフォーマンスの問題を正確に診断するには、統計が使用可能である必要があります。
統計の収集の詳細は、『Oracle Database 2日間でパフォーマンス・チューニング・ガイド』を参照してください。
ノート: Oracle Enterprise Managerを使用できない場合、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』の記載に従い、DBMS_MONITORサブプログラムを使用して統計を収集できます。
Oracle Databaseには、Oracle Databaseアプリケーションの監視および分析に使用できるトレース・ツールがいくつか用意されています。詳細は、『Oracle Database SQLチューニング・ガイド』を参照してください。
既存機能の使用
既存の機能を使用しているアプリケーションは、そうではないアプリケーションよりも開発およびメンテナンスが簡単であり、また実行速度も速くなります。
アプリケーションを開発するときは、プログラミング言語、オペレーティング・システム、Oracle Database、およびOracle Databaseで提供されているPL/SQLパッケージおよびタイプの既存の機能を可能なかぎり使用してください。
多くの開発者が再開発する既存の機能の例には、次の機能があります。
-
制約
制約の概要は、「表でのデータ整合性の保証」を参照してください。
-
SQLファンクション(SQLに組み込まれている関数)
SQLファンクションの詳細は、『Oracle Database SQL言語リファレンス』に関する項を参照してください。
-
順序(一意の連続的な値の生成が可能)
「順序の作成および管理」を参照してください。
-
監査(選択したユーザーのデータベース・アクションの監視および記録)
監査の概要は、『Oracle Databaseセキュリティ・ガイド』を参照してください。
-
レプリケーション(分散データベース・システムを構成する複数のデータベースで、表などのデータベース・オブジェクトをコピーしてメンテナンスするプロセス)
レプリケーションの詳細は、Oracle GoldenGateのドキュメントを参照してください。
-
メッセージ・キューイング(Webベースのビジネス・アプリケーション間の通信方法)
Oracle Databaseアドバンスト・キューイング(AQ)の概要は、「Oracle Databaseアドバンスト・キューイング・ユーザーズ・ガイド」を参照してください。
-
レコード変更履歴のメンテナンス
Workspace Managerの概要については、『Oracle Database Workspace Manager開発者ガイド』を参照してください。
例8-4では、2つの同時トランザクションが表に格納されたメッセージをデキューします(つまり、各トランザクションは、表の次の未処理行を検出しロックします)。例では、DBMS_AQ.DEQUEUEプロシージャ(『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照)を単純に起動するのではなく、この例では、表のファンクション索引が作成され、次にそのファンクションが各トランザクションで使用され、行が取得され、メッセージが表示されます。
例8-4のコードは、制限されたDBMS_AQ.DEQUEUE呼出しのような機能を実装します。ただし、機能は少なくなります。既存の機能(この場合、ファンクション・ベース索引)を使用して節約された開発時間が大きくなる場合があります。
例8-4 同時デキュー・トランザクション
表の作成:
DROP TABLE t;
CREATE TABLE t
( id NUMBER PRIMARY KEY,
processed_flag VARCHAR2(1),
payload VARCHAR2(20)
);
表の索引の作成:
CREATE INDEX t_idx ON
t( DECODE( processed_flag, 'N', 'N' ) );
表への移入:
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);
表の表示:
SELECT * FROM t;
結果:
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.
1つ目のトランザクション:
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;
/
結果:
Got row 2, payload 2
コンカレント取引:
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;
/
結果:
Got row 4, payload 4
関連情報:
-
『Oracle Database新機能ガイド』(各リリース)
-
(各リリースの)『Oracle Database概要』
エディショニング・ビューによるデータベース表のカバー
アプリケーションでデータベース表が使用されている場合、停止時間を最小限にする、または発生するさせないように、エディションベース再定義(EBR)を使用して、使用中のアプリケーションのデータベース・コンポーネントをアップグレードできるように各表をエディショニング·ビューで覆います。
エディション・ベースの再定義の詳細は、『Oracle Database開発ガイド』に関する項を参照してください。