4.5.6 ORBの初期化と終了
- 〈この項の構成〉
(1) ORBのインスタンス
ORB.init(String[ ],Properties)はORBのインスタンスを新たに生成します。ORBのインスタンスごとにTPBroker内部で使用するスレッドなどを生成し,コネクションを管理しています。これらが複数存在することで,性能の問題やメモリを圧迫するという問題が発生しますので,同時に保持するORBインスタンス数は必要最小限にしてください。また,ORBインスタンスはアプリケーションで参照をクリアしてもガベージコレクタによってメモリ上から破棄されません。そのため,必要がなくなったORBインスタンスに対しては,リソースとメモリの解放を行うorg.omg.CORBA.ORBクラスのdestroy( )メソッドを発行してください。ただし,destroy( )メソッドは使用中のコネクションも即時に解放するため,例外が発生することがあります。発行前には通信していないことを確認してください。ORBを必要とするクラスやメソッドが多く存在する場合や,Servletのように一つのプロセス内のスレッドとしてユーザアプリケーションが動作するような場合には,引数ありのORB.init( )の発行回数を抑止するための工夫が必要です。その方法として,一度取得したORBのインスタンスをstatic変数に保持しておき,それを使いまわすという方法が考えられます。
コーディング例: static org.omg.CORBA.ORB _orb=null; public static synchronized org.omg.CORBA.ORB getORB(String[ ] args,Properties props){ if(_orb==null){ _orb=org.omg.CORBA.ORB.init(args,props); } return _orb; }
ORBのインスタンスが必要な場合は上記のgetORBメソッドを呼び出すようにすることで,引数ありのORB.initの発行回数を抑止できます。しかし,クラスがリロードされるとstatic変数(上記例の_orb)が再度初期化されることに注意してください。
Java 2 SDK,Standard Editionでは,クラスをロードしたクラスローダが終了した場合にクラスがアンロードされ,リロードされたときにstatic変数が初期化されます。Servletなどクラスのリロード機能を持つアプリケーションでは,ユーザが意識していないところでServletなどが独自のクラスローダを終了させる場合があります。上記を考慮して,ORB.initの発行回数を抑止する方法として次の2とおりの方法が考えられます。
- 方法1(推奨):
-
ORBのインスタンスをstatic変数で保持するクラスを,「リロード不可能なパス」に配置します。リロード機能を持つアプリケーションが「リロード可能なパス」として示す個所にクラスを配置するのではなく,CLASSPATHなどJava VMがロードできるパスにクラスを配置することで,「リロード不可能なパス」に配置することになります。
- 方法2:
-
ORBのインスタンスをstatic変数で保持するコーディングではなく,ORBのインスタンスをシステムプロパティで保持するようなコーディングにすることで,クラスのリロードが起こってもORBインスタンスを保持することができます。
コーディング例: public static synchronized org.omg.CORBA.ORB getORB(String[] args,Properties props){ Properties sys_props=System.getProperties( ); org.omg.CORBA.ORB _orb=(org.omg.CORBA.ORB)sys_props.get("MyORB"); if(_orb==null) { _orb=org.omg.CORBA.ORB.init(args,props); } sys_props.put("MyORB",_orb); return _orb; }
この方法を使用する場合は,次の点に注意してください。
-
ORB.init( )を複数回発行する必要がある場合は,必ずORBインスタンスをシステムプロパティに登録する前にORB.init( )の発行を行ってください。
-
ORBインスタンスをシステムプロパティに登録した場合,ORBインスタンスを登録したキーを引数にしてjava.lang.System.getProperty( ),またはjava.util.Properties.getProperty( )を行うと,nullオブジェクトが返されます。
-
(2) ORB.shutdown
org.omg.CORBA.ORB.shutdown( )を発行する場合は,次の点に注意してください。
-
org.omg.CORBA.ORB.shutdown( )はすべてのメソッドコールが終了したあと,発行してください。
-
org.omg.CORBA.ORB.shutdown( )実施後は,org.omg.CORBA.ORB.shutdown( )したORBインスタンスから生成したオブジェクトリファレンスを使用することができなくなるため,リファレンスを解放してください。
-
org.omg.CORBA.ORB.shutdown( )したORBインスタンスは使用しないでください。
-
サーバメソッド内でorg.omg.CORBA.ORB.shutdown(true)を発行すると,BAD_INV_ORDER例外が発生する場合があります。