Question & Answer
Question
特定の AIX システムで Java ルーチンを実行すると、すべて SQL1131N で失敗します。 新しい Java ルーチンをデプロイしようと sqlj.install_jar を実行しても、やはり SQL1131N もしくは SQL1042C で失敗します。
Cause
すべての Java ルーチンは db2fmp (Java) プロセスによって実行されます。
db2fmp (Java) は DB2 インスタンス起動後、初めて Java ルーチンを実行すると自動的に起動しますが、このとき JNI_CreateJavaVM() を呼び出してプロセス内に Java VM をロードします。
しかし JNI_CreateJavaVM() が JIT コードを呼び出すと、SED が有効な AIX システムでは Java VM のロードは失敗します。
お使いの AIX システムで SED が有効かどうかは、以下のように sedmgr コマンドで確認できます。
SED モードが 'setidfiles' もしくは 'all' に設定されている場合、すべての Java ルーチンの呼び出しは SQL1131N で失敗します。
「関連情報」にある Java のマニュアルに記述されているように、JIT を有効にする場合、Java VM をロードするプロセス (今回のケースでは db2fmp) を SED の対象から除外する必要があります。
注: SED のデフォルトは 'select' なので、多くのシステムではこの問題に該当しません。
ただし、PowerSC によって提供されるスクリプトによって、SED 設定が変更される可能性があります。
db2fmp (Java) は DB2 インスタンス起動後、初めて Java ルーチンを実行すると自動的に起動しますが、このとき JNI_CreateJavaVM() を呼び出してプロセス内に Java VM をロードします。
しかし JNI_CreateJavaVM() が JIT コードを呼び出すと、SED が有効な AIX システムでは Java VM のロードは失敗します。
お使いの AIX システムで SED が有効かどうかは、以下のように sedmgr コマンドで確認できます。
$ sedmgr
Stack Execution Disable (SED) mode: select
SED configured in kernel: select
SED モードが 'setidfiles' もしくは 'all' に設定されている場合、すべての Java ルーチンの呼び出しは SQL1131N で失敗します。
「関連情報」にある Java のマニュアルに記述されているように、JIT を有効にする場合、Java VM をロードするプロセス (今回のケースでは db2fmp) を SED の対象から除外する必要があります。
注: SED のデフォルトは 'select' なので、多くのシステムではこの問題に該当しません。
ただし、PowerSC によって提供されるスクリプトによって、SED 設定が変更される可能性があります。
- IBM PowerSC
PowerSC は、セキュリティー・コンプライアンスを自動化して、コンプライアンスの評価と監査に関するレポートを作成します。セキュリティー・コンプライアンスの自動化は、企業においてセキュリティー・コンプライアンスにかかるコストを削減する上でも役立ちます。
Answer
この問題に遭遇した場合、以下のいずれかの方法で問題を回避できます。
- SED から db2fmp を除外する
- AIX システムに root としてログインします。
- db2fmp 実行ファイルを SED から除外するため、 sedmgr コマンドを実行します。
# sedmgr -c exempt <db2fmp のパス>
# sedmgr -c exempt /home/db2inst1/sqllib/adm/db2fmp # dump -X64 -ov /home/db2inst1/sqllib/adm/db2fmp ***Object Module Header*** # Sections Symbol Ptr # Symbols Opt Hdr Len Flags 4 0x00006a08 673 120 0x1082 Flags=( EXEC DYNLOAD DEP_EXEMPT ) Timestamp = "Mar 31 16:29:22 2011" Magic = 0x1f7 (64-bit XCOFF)
- システム全体の SED 設定を、より緩い設定に変更する
- AIX システムに root としてログインします。
- システム全体の SED 設定を変更するため、sedmgr コマンドを実行します。変更を反映させるには AIX の再起動が必要です。
# sedmgr -m select # shutdown -Fr
- Java ルーチンで JIT コンパイラーを使用不可にする
- Db2 のインスタンス所有者としてシステムにログインします。
- JIT コンパイラーを使用不可にするため、環境変数を設定します。
$ export JAVA_COMPILER=none $ db2set DB2ENVLIST=JAVA_COMPILER $ db2stop $ db2start
注: JIT を使用不可にすると、Java ルーチンのパフォーマンスが低下する可能性があります。
関連情報
Java routines fail with SQL1131N if SED is enabled on AIX systems.
The Just-In-Time (JIT) compiler
スタック実行使用不可保護 (SED)
SED の問題点と考慮事項
実行可能ファイル用の SED フラグ
sedmgr コマンド
Java routines fail with SQL1131N if SED is enabled on AIX systems.
The Just-In-Time (JIT) compiler
スタック実行使用不可保護 (SED)
SED の問題点と考慮事項
実行可能ファイル用の SED フラグ
sedmgr コマンド
[{"Type":"MASTER","Line of Business":{"code":"LOB10","label":"Data and AI"},"Business Unit":{"code":"BU058","label":"IBM Infrastructure w\/TPS"},"Product":{"code":"SSEPGG","label":"Db2 for Linux, UNIX and Windows"},"ARM Category":[{"code":"a8m500000008PmVAAU","label":"Programming Interface-\u003EJDBC"},{"code":"a8m500000008PmjAAE","label":"Routines - Stored Procedures and UDF-\u003EJava\/Non-SQL Routines"}],"ARM Case Number":"","Platform":[{"code":"PF002","label":"AIX"}],"Version":"All Versions"}]
Was this topic helpful?
Document Information
Modified date:
24 August 2023
UID
swg21596992