Interstage Application Server アプリケーション作成ガイド (データベース連携サービス編) |
目次 索引 |
第7章 サーバアプリケーションの開発(CORBAアプリケーション/Java言語) |
サーバアプリケーションの構成のうち、利用者が作成する初期化処理、ユーザサービス処理部についての基本形を以下に示します。なお、サーバアプリケーションは、JNIの機構を使用して作成します。
初期化処理部では、以下を実装します。
// 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(); |
アプリケーションの登録時には、インプリメンテーション情報定義ファイルの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実行ファイルは、環境変数の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を発行してトランザクションを終了させてください。
目次 索引 |