サーバアプリケーションの構成のうち、利用者が作成する初期化処理、およびユーザサービス処理部についての基本形を以下に示します。なお、サーバアプリケーションは、JNIの機構を使用して作成します。
■初期化処理部
初期化処理部では、以下を実装します。
ORBの初期化
POAオブジェクトの初期化と生成
Servantオブジェクトの生成
オブジェクトリファレンスの取得およびネーミングサービスへの登録
サーバがデータベースにアクセスするための初期化
サーバアプリケーションの活性化
サーバがデータベースにアクセスするための終了処理
// ORBの生成と初期化 ORB Orb = ORB.init( args, null );
// 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 );
// Servantの生成 Servant svt = new UserServant(); // Default Servantに設定 childPOA.set_servant( svt ); org.omg.CORBA.Object _bindObj = childPOA.create_reference( "IDL:ODdemo/calculator:1.0" );
// ネーミングサービスのオブジェクトリファレンスの取得 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 );
_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オペレーションは、データベースとのコネクションを確立します。
// POAマネージャの獲得 POAManager poamanager = childPOA.the_POAManager(); // POAマネージャのactivate poamanager.activate(); Orb.run();
注意
アプリケーションの登録時、CORBAアプリケーション情報定義ファイルのmodeに「SYNC_END」を指定する必要があります。「SYNC_END」を指定することにより、アプリケーションが非活性化された場合やアプリケーション停止時まで復帰しないようになります。
サーバがデータベースにアクセスするための終了処理を行います。_ots.termメソッドは、データベースへのコネクションをクローズします。
_ots.term();
■ユーザサービス処理部
ユーザサービス処理部には、データベースへの処理を記述するメソッドとそのメソッドを呼び出すように記述します。
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文を発行する処理部のソースにおいて、データベースに応じたコード系に変換する処理を入れてください。
#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; }
module ODdemo{ interface calculator{ void deposit(in long a, in long b); void withdrawal(in long a, in long b); }; };
注意
サーバアプリケーションが異常を検出した場合
サーバアプリケーションが以下のようなエラーを検出した場合、エラーをクライアントアプリケーションに通知する必要があります。
自プログラムの異常を検出した場合
データベースシステムからエラーが通知された場合
システムから資源不足やメモリ不足などのエラーが通知された場合
エラーが通知されたクライアントアプリケーションでは、rollbackを発行してトランザクションを終了してください。