ページの先頭行へ戻る
Interstage Application Server アプリケーション作成ガイド(データベース連携サービス編)
Interstage

4.2.2 ソースプログラムの作成

サーバアプリケーションの構成のうち、利用者が作成する初期化処理、およびユーザサービス処理部についての基本形を以下に示します。なお、サーバアプリケーションは、JNIの機構を使用して作成します。


初期化処理部

初期化処理部では、以下を実装します。

  1. ORBの初期化

  2. POAオブジェクトの初期化と生成

  3. Servantオブジェクトの生成

  4. オブジェクトリファレンスの取得およびネーミングサービスへの登録

  5. サーバがデータベースにアクセスするための初期化

  6. サーバアプリケーションの活性化

  7. サーバがデータベースにアクセスするための終了処理


(1) ORBの初期化
// ORBの生成と初期化
ORB Orb = ORB.init( args, null );

(2) POAオブジェクトの初期化と生成
// RootPOAのオブジェクトリファレンスの取得
org.omg.CORBA.Object _tmpObj = Orb.resolve_initial_references( "RootPOA" );
POA rootPOA = POAHelper.narrow( _tmpObj );

// インタフェース用のPOA作成
// ポリシリスト作成
org.omg.CORBA.Policy policies[] = new org.omg.CORBA.Policy[4];
policies[0] = rootPOA.create_servant_retention_policy(
    ServantRetentionPolicyValue.NON_RETAIN );
policies[1] = rootPOA.create_request_processing_policy(
    RequestProcessingPolicyValue.USE_DEFAULT_SERVANT );
policies[2] = rootPOA.create_id_assignment_policy(
    IdAssignmentPolicyValue.SYSTEM_ID );
policies[3] = rootPOA.create_id_uniqueness_policy(
    IdUniquenessPolicyValue.MULTIPLE_ID );

// Default Servant用のPOAオブジェクトの作成
POA childPOA = rootPOA.create_POA( "childPOA", null, policies );

(3) Servantオブジェクトの生成
// Servantの生成
Servant svt = new UserServant();

// Default Servantに設定
childPOA.set_servant( svt );
org.omg.CORBA.Object _bindObj = childPOA.create_reference( "IDL:ODdemo/calculator:1.0" );

(4) オブジェクトリファレンスの取得およびネーミングサービスへの登録
// ネーミングサービスのオブジェクトリファレンスの取得
tmpObj = Orb.resolve_initial_references( "NameService" );
NamingContextExt Cos = NamingContextExtHelper.narrow( _tmpObj );

// ネーミングサービスのresolveメソッドを発行し、
// サーバアプリケーションのオブジェクトリファレンスの獲得
String NCid   = new String( "ODdemo::calculator " );
String NCkind = new String( "" );
NameComponent nc =  new NameComponent( NCid, NCkind );
NameComponent NCo[] = { nc };
try {
    Cos.unbind( NCo );
} catch( Exception e ) {
    ;
}
Cos.bind( NCo, _bindObj );

(5) サーバがデータベースにアクセスするための初期化
_tmpObj = Orb.resolve_initial_references( "TransactionServerInit" );
OTS _ots = OTSHelper.narrow( _tmpObj );
_ots.init(Orb, "IDL:ODdemo/calculator:1.0", "XA連携プログラム");

サーバがデータベースにアクセスするための初期化を行います。
_ots.initオペレーションのパラメタには、サーバアプリケーションのインプリメンテーションIDを指定します。また、XA連携用プログラムには、otsxamkpgmコマンドの-javaオプションで作成されたものを指定します。
_ots.initオペレーションは、データベースとのコネクションを確立します。


(6) サーバアプリケーションの活性化
// POAマネージャの獲得
POAManager poamanager = childPOA.the_POAManager();

// POAマネージャのactivate
poamanager.activate();
Orb.run();

注意

アプリケーションの登録時、CORBAアプリケーション情報定義ファイルのmodeに「SYNC_END」を指定する必要があります。「SYNC_END」を指定することにより、アプリケーションが非活性化された場合やアプリケーション停止時まで復帰しないようになります。


(7) サーバがデータベースにアクセスするための終了処理

サーバがデータベースにアクセスするための終了処理を行います。_ots.termメソッドは、データベースへのコネクションをクローズします。

_ots.term();

ユーザサービス処理部

ユーザサービス処理部には、データベースへの処理を記述するメソッドとそのメソッドを呼び出すように記述します。


ユーザメソッド処理SQL実行ライブラリロード
public UserServant() {
    System.loadLibrary( "SQL実行ライブラリ" );
}


SQL実行ライブラリには、C言語/C++言語で作成されたSQL実行ファイル(*.DLL)を指定します。
また、SQL実行ファイルは、環境変数PATHに指定されたフォルダに存在する必要があります。


SQL実行ライブラリには、C言語/C++言語で作成されたSQL実行ファイル(*.so)を指定します。
また、SQL実行ファイルは、環境変数LD_LIBRARY_PATHに指定されたディレクトリパスに存在する必要があります。


ユーザメソッド処理
public void deposit(int a, int b) {
    N_deposit(a, b);
    return;
}
public native void N_deposit(int a, int b);

SQL文を発行する処理部(C言語)ソース例、およびIDLファイルの定義例を以下に示します。なお、SQL文を発行する処理部の関数名は、ユーザメソッドクラスファイルをもとにjavahコマンドを実行して作成されたファイル内に定義されている関数名を使用します。

また、このSQL文を発行する処理部のソースにおいて、データベースに応じたコード系に変換する処理を入れてください。


SQL文を発行する処理部(C言語)ソース例
#include    <windows.h>
#include    <sqlca.h>
#include    <oraca.h>
#include    "UserServant.h"

EXEC ORACLE OPTION (ORACA=YES);

VARCHAR      dynstmt[80];
int          accountno;
static char  *error_id;

/* Handle SQL runtime errors. */
void sql_error();

JNIEXPORT void JNICALL Java_UserServant_N_1deposit(JNIEnv *env, jobject obj, jint param1, jint param2)
{
    EXEC SQL BEGIN DECLARE SECTION;
         long      pa1;
         long      pa2;
    EXEC SQL END DECLARE SECTION;
         pa1 = param1;
         pa2 = param2;
    EXEC SQL WHENEVER SQLERROR GOTO sql_err;

    oraca.orastxtf = ORASTFERR;
    EXEC SQL UPDATE a_account SET balance=balance+:pa2 WHERE accountno=:pa1;
    return;

sql_err:
    sql_error("Oracle error");
    return;
}

void 
sql_error(msg)
char *msg;
{
    printf("\n%s", msg);
    printf("\n%.*s\n", sqlca.sqlerrm.sqlerrml, sqlca.sqlerrm.sqlerrmc);
    printf("in \"%.*s...\"\n", oraca.orastxt.orastxtl, oraca.orastxt.orastxtc);
    printf("on line %d of %.*s.\n\n", 
           oraca.oraslnr, oraca.orasfnm.orasfnml, oraca.orasfnm.orasfnmc);

    EXEC SQL WHENEVER SQLERROR CONTINUE;

    return;
}

IDL定義ファイル例
module ODdemo{
    interface    calculator{
              void     deposit(in long a, in long b);
              void     withdrawal(in long a, in long b);
    };
};

注意

サーバアプリケーションが異常を検出した場合

サーバアプリケーションが以下のようなエラーを検出した場合、エラーをクライアントアプリケーションに通知する必要があります。

  • 自プログラムの異常を検出した場合

  • データベースシステムからエラーが通知された場合

  • システムから資源不足やメモリ不足などのエラーが通知された場合

エラーが通知されたクライアントアプリケーションでは、rollbackを発行してトランザクションを終了してください。