メニューボタン
IBMi海外記事2016.01.14

DB2 for i 7.1 TR10および i 7.2 TR2の新機能

Michael Sansoterra 著

Technology Refresh によってDB2 for i で最近利用できるようになった新機能をいくつか説明します。

SQL 関数パラメーター限度

DB2 for i のユーザー定義関数機能で大好評だったのは、スカラー関数のパラメーター・リスト限度が、 90 パラメーターから驚くべき 1024 パラメーターにジャンプアップしたことです。同様に、表関数の入力パラメーターと戻り列の組み合わせ限度が、 125 から 1025 に増えました。

90 を超えるパラメーターをスカラー関数に渡したいような例は、私はすぐ頭にパッと思い浮かびません。しかしながら、表関数については、いくつか例を思いつくことができます。ここでは、このアップしたパラメーターと戻り列の限度が役立ちます。例えば、大量の列を備えている可能性があるコンマ区切りテキスト・ファイル (CSV) を構文解析する、表関数を構築しているとします。表関数で 125 列以上戻す必要がある場合、限度アップは間違いなく重宝します。

RUNSQLSTM コード・フォーマットの改善

DB2 for i カタログ・ビューの大きなメリットは、(コードが難読化されていない限り) ストアード・プロシージャー、トリガー、ビュー、関数など各種 SQL オブジェクトの作成に使用するコードがビューに格納されていることです。System i Navigator のようなツールを使用して開発者は、これらオブジェクトの SQL ソースをデータベースのカタログから簡単に取得できます。

過去に RUNSQLSTM コマンドを使用してコードベース SQL オブジェクトを作成していたとき、行の書式設定が正しく行われなかったため、システム・カタログからの以降のソース・コードの取得が読み取りにくくなっていた可能性があります。この点は是正され、ソース・コード行の書式設定が期待どおりに保存されるようになりました。

DB2 for i サービス

サービス・ビューと関数は溜まり続けます。これらのサービスは、管理者および開発者に、API プログラミングの複雑さに取り組まなくても OS 関連の関数を覗き見る素晴らしい方法を提供します。システム・オブジェクトのリストを取得するのに、これ以上ユーザー・スペースに煩わされたい人がいるのでしょうか? 新たに利用できるようになったサービスをいくつか紹介します。

ACTIVE_JOB_INFO 表関数

このユーザー定義表関数 (UDTF) は、 QSYS2 スキーマに常駐し、WRKACTJOB IBM i OS コマンドのように、システム上のアクティブ・ジョブを照会できます。関数では 4 つのパラメーターを指定できます。

  1. Reset statistics indicator--ジョブ統計情報がリセットされているかどうかを管理し、YES か NO で指定します。
  2. Subsystem Filter--サブシステムのコンマ区切りリスト
  3. Job Name Filter--以下のような特殊値があります。*--現行ジョブの情報のみ戻されます。*ALL--すべてのジョブの情報が戻されます。*CURRENT--ジョブ名が現行ジョブと同じすべてのジョブの情報が戻されます。*SBS--すべてのアクティブ・サブシステム・モニターの情報が戻されます。*SYS--すべてのアクティブ・システム・ジョブの情報が戻されます。
  4. Current User Filter--結果に記載するユーザーのコンマ区切りリスト。名前が示すように、ジョブ・ユーザーではなく、現行ユーザーをフィルターに使用します。

このサンプル照会では、(前回、統計情報をリセットして以降) 経過ディスク入出力カウントが 10000 を超えるユーザー MIKE および JOHN の、すべてのアクティブ・ジョブのジョブ情報を戻します。

技術情報03

結果は以下のようになります。

JOB_NAME SUBSYSTEM AUTH_
NAME
JOB_
STAT
MEMORY_
POOL
CPU DISK_IO_
COUNT
034447/MIKE/QPADEV0001 QINTER MIKE DSPW INTERACT 509 14000
034441/QUSER/QZDASOINIT QUSRWRK MIKE TIMW BASE 850 49000
034442/QUSER/QZDASOINIT QUSRWRK MIKE TIMW BASE 605 33002
034443/QUSER/QZDASOINIT QUSRWRK MIKE RUN BASE 1452 78400
034440/QUSER/QZRCSRVS QUSRWRK JOHN TIMW BASE 900 45010
034051/QUSER/QZSCSRVS QUSRWRK MIKE TIMW BASE 450 26704

この UDTF で簡単にアクティブ・ジョブを照会し、過剰な CPU またはディスクの使用量をテストする機能は、とてつもない量のリソースを食い荒らしているジョブを特定するのに役立ちます。

さらに例を 1 つ挙げます。

-- 例: サブシステムのすべてのジョブの情報の取得
-- QUSRWRK、QBATCH、および QINTER (ユーザー MIKE)
-- 統計情報をリセットしません
--

技術情報04

この関数は数多くの便利な列を戻すため、その入り組んだ内容をすべて説明している この DeveloperWorks ページを必ず確認してください。

SCHEDULED_JOB_INFO ビュー

このサービス・ビューでは、 SQL 担当者は、IBM i ジョブ・スケジューラーの状態を明確に表示します (WRKJOBSCDE の使用と類似)。

技術情報05

結果は以下のようになります。

SCHED_
JOB_NAME
SCHED_TIME SCHEDULE NEXT_SUB_DATE
DAY_END 01.00.00 *TUE,*WED,
*THU,*FRI,*SAT
9/16/2015
STATUS DESCRIPTION COMMAND_
STRING
LAST_ATT_SUB
_TIMESTAMP
SCHEDULED Day End
Processing
CALL PGM
(PROD/DAY_END)
9/2/2015 1:00

このビューでは、ジョブ・スケジューラーに、プログラマチック・アクセスが簡単にでき、実行依頼されたものの失敗したジョブ、保留中のジョブなどについて、コマンド文字列内のプログラムまたはライブラリーを検索する場合に使用できます。この種の機能は、管理者には最良の友となります。すべてを調べなくても必要なものを正確に照会できるからです。

QSYS2.JVM_INFO ビューおよび SetJVM ストアード・プロシージャー

コードに問題がある場合に、 Java を扱うのは大変な場合があります。従来は、 5250 バッチまたは対話式ジョブでしたが、ジョブ内で行われていること (呼び出しスタック、活動化グループ、オープン・ファイル、相対レコード番号、ジョブ定義属性など) を探る多くのツールがあります。Java ジョブの内部を覗き見るのはかなり大変でした。IBM i 6.1 で、Java ジョブをより簡単に覗き見ることができる Work with JVM Jobs (WRKJVMJOB) コマンドが導入されました。新しい SET_JVM ストアード・プロシージャーも役に立ちます。

たとえば、Java コードに障害があるジョブに遭遇した場合、プロシージャー SET_JVM を使用して Java ダンプを発行できます。

技術情報06

Java ダンプは、ユーザーのホーム・フォルダーの IFS に置かれます。名前は「javacore」で始まり、日付とタイムスタンプがその後に続きます。出力ファイルの例を以下に示します。

技術情報07

大きすぎてここに示すことはできませんが、ダンプには OS 情報、バージョン、開始パラメーター、環境変数、メモリー使用量、スレッド、ガーベッジ・コレクター情報、デフォルトのロード済みライブラリー (jar ファイル・パスなど) などのJava 環境情報、およびクラスといったかなり便利な情報が入っています。

プロシージャーは、修飾ジョブ名 (特殊値 * が現行ジョブ) と実行するアクションという 2 つのパラメーターを許可します。サポートされているアクションを以下に示します (この DeveloperWorks ページがからこっそり持ってきた説明付き:)

GC_ENABLE_VERBOSE--冗長なガーベッジ・コレクションの詳細を有効にします。

GC_DISABLE_VERBOSE--冗長なガーベッジ・コレクションの詳細を無効にします。

GENERATE_HEAP_DUMP--JVM のヒープから情報を生成します。まだ解放されていないすべてのヒープ・スペース割り振りのダンプを生成します。

GENERATE_SYSTEM_DUMP--JVM のシステム詳細を生成します。ダンプを開始したときに実行していたジョブのバイナリー形式のロウ・メモリー・イメージを生成します。

GENERATE_JAVA_DUMP--JVM の Java 詳細を生成します。JVM および JVM 内で動作している Java アプリケーションの診断情報が入った複数のファイルを生成します。

Java ジョブのレビューおよびトラブルシューティングの段階で、JVM_INFO ビューを使用して IBM i でアクティブな JVM ジョブの概要を取得できます。パーティションの JDK デフォルト・バージョンを Java 8 に変更したとしましょう。IPL が実施され、あなたは、8 以外のどの JVM バージョンがシステムで動作しているか知りたいと考えています。以下のクエリーが、8 以外の JVM を実行しているすべてのジョブを表示して、この疑問に答えます。

技術情報08

--JDK パスを検査します

結果は以下のようになります (見出し名を変更し、JAVA_HOME 列を省略しました):

ジョブ名 開始時間 スレッド ユーザーディレクトリー ヒープ KB メモリー KB アーキテクチャー
734627/QSYS/ 9/01/15 20 / 5490 72579 32
QSRVMON 3:44 PM          
734667/QLWISVR/
ADMIN1
9/01/15 3:45 PM 35 /QIBM/UserData/OS/
AdminInst/admin1/wlp/
usr/servers/admin1
65536 101774 32

ビューによって戻された列を確認すると、大量のメモリーを消費するジョブや 32 ビット対 64 ビット・アーキテクチャーを実行するジョブなど、明らかに結果から収集すべき価値あるものがたくさんあります。

Java ジョブは、呼び出し対話式ジョブまたはバッチ・ジョブ以外のジョブでホストされる場合が多いため、Java コードが IBM i のどこで実行しているか知るのは難しい場合が多いので、このビューは重宝します。例えば、私が、 QSHELL (または RUNJVA コマンド) を使用して対話式ジョブから Java プログラムを開始した場合、対話式ジョブではなく qp0zspwp というジョブが、 Java コードを実行しました。

一方、RPG プログラムが、 Java Native Interface (JNI) を使用して Java コードを呼び出す場合、JVM は、現行ジョブ内で開始されます。DB2 Java ルーチンも同じジョブで Java コードを実行します。これは、(Java ベースの HTTP 機能を使用する) サービス・ビュー SYSTOOLS.GROUP_PTF_CURRENCY を照会し、次に JVM_INFO を照会することで確認できます。クエリーを実行したジョブで、 JVM が関連付けられたことがわかります。

IBM i の多数の人気の Java ベース・アプリケーションは言うに及ばず、Java コード標準 DB2 機能に実装している IBM および JNI で Java の世界にクロスオーバーしている RPG プログラマーには、IBM i の JVM が消費しているリソースについて認識することが重要です。JVM_INFO は情報収集に役立つ優れたツールです。

あわせて読みたい記事

PAGE TOP