「ローカルアクセス」ってどういうこと?? ですが、それは次のような「引数のない」 createSession メソッドの呼び出しのことです。
NotesFactory.createSession()
このローカルアクセスというメソッドの呼び方は、このメソッドを実行する環境にはノーツクライアントかドミノサーバーが導入されていて、さらにアクセスするデータベースが同じマシンにある、という状況を前提にしています。
このことによって、Java プログラムの置き場所に制約がでてきます。リモートアクセスで使用すれば、同じマシンでも別のマシンでも同じプログラムを実行させることができます。つまり、トポロジーの自由度がリモートアクセスの方が圧倒的に高いわけです。
さらにこのシグニチャのメソッドは、マルチスレッドに対応していないので、これが実行されるスレッドは、スレッド毎にかならず毎回ドミノによって初期化を行い、スレッドを離れる時には終了処理を行われる必要があります。(この初期化が
NotesThread.sinitThread( ) で、終了処理が
NotesThread.stermThread( ) です。上のような例を見たことある人は、絶対みたことあるはずですよ。「おまじない」などと言いくるめられて、なにがなんだかわかんないけど使ってたりしませんか??)
でなければ、Thread を継承してドミノオブジェクト用の初期化/終了処理を折り込んだ
NotesThread クラスを継承して使用する必要があるわけです。
要は、ローカルアクセスの場合、sinitThread() で初期化を行い stermThread で終了処理を行うスレッドの中だけでしかドミノオブジェクトは使用できない、ということです。
そのため、コーディングスタイルに多大な制約がでてくるわけです。
このある処理と処理の間のシングルスレッドの中でしか使用できない、ということから、たとえばサーブレットなどでは、当然他のクラスを呼び出してそこで使用するなんてことはできませんし、チェインやフォワードなんてとんでもないことになってしまいます。
その他、各プラットフォームによって、ローカルアクセスをさせるための環境変数や OS の設定が異なります。
せっかく Java で書きながら可搬性がなくなってしまう可能性があるわけです。
さらに、みんなサーバーIDからのアクセスになってしまい、セキュリティの問題やメールなどを中で送信した場合は、そのまた返信がサーバーに来てしまう、とかアクセスログが無意味になってしまう、などの問題もあります。(最近は最初の引数だけを null にして、ユーザー、パスワードを指定できるようになりましたので、こうとばかりは言い切れませんが)
じゃあなぜそんなものが例によくあるか?? なのですが、単純化して言い切ってしまうと、R4.6
の時の書き方なのですね、これは。
それがそのまま何故か生き残ってしまっている、ということとも言えます。単に新しいことを勉強していないだけで習慣的にこう書いている人もいるみたいです。
ただし、そのプログラムが動くところが必ずローカルであるような環境、つまりエージェントやドミノについてくるサーブレット・マネージャでサーブレットを使用するような状況では使用することがあります。
リモートアクセスよりちょっとだけ速いはずですし、だいたいエージェントの場合はドミノデザイナーでスケルトンを作ってくれるのがローカルでできてきますし、署名などで権限をコントロールできるので、今のエージェントのアーキテクチャだったらローカルアクセスで問題ないでしょう。
この後に述べるリモートアクセスのように CORBA
などの標準/手順に従っていない、ドミノ C/C++
API への直接のアクセスであるため「ローカル」と言われています。
そのため、先に述べたような面倒な初期化/終了処理が必要になるわけです。おまけに、このドミノオブジェクトは
recycle() メソッドを使って解放してやらなければ、Java
VM のガーベージコレクションの対象になりません。
ちょっとした処理でさっといなくなってしまうエージェントなどならいいですが、エージェントも含めて大部の処理をする場合、大変なことになってしまいます。以上述べてきたようなことを守らないと、本当に簡単にサーバーをクラッシュさせます。
しかも「ドミノ C/C++ API への直接のアクセス」=「ドミノのコアへのアクセス」なので、クラッシュのさせ方も並大抵ではありません。
リモートアクセスは R5 からできるようになったやり方で、CORBA にのっとっています。
そのため、アクセスされるサーバーには DIIOP タスク (DIIOP = Domino Intenet Inter-ORB Protocol) を起動しておき、ドミノのセキュリティを設定しておく必要があります。
引数にサーバー名とユーザー、パスワードを指定して
createSession メソッドを呼び出せば、それが「リモートアクセス」ということになります。(SSO構成の場合は LtpaToken も指定できます)
前後の NotesThread.siniThread() / NotesThread.stermThread(
) は必要ありません。
ドミノにアクセスするプログラムは、ドミノサーバーと同じマシンにあっても、別のマシンからアクセスさせてもかまいません。どこに置いてもかまわないことになります。
マルチスレッドの制約もありません。
ローカルアクセスを行うサーバーでのような、各プラットフォーム固有の環境変数やユーザーの設定が必要ありません。
ローカルアクセスとリモートアクセスを比較して、(少なくとも初心者にとっては)
ローカルアクセスの方がいい、なんてことはありませんので、少なくともこのサイトでのコーディング例にはローカルアクセスは出てきません。ご了承の上、ご理解ください。
ぜひ皆様も、もしローカルアクセスで書いているような例題に出くわしたら、リモートアクセスに自分で書き換えちゃってみてください。制約はローカルアクセスの方が多いんだから、大変ではないはずですよ。
|
|