Hitachi

VisiBroker Version 5 Borland(R) Enterprise Server VisiBroker(R) プログラマーズリファレンス


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( )を発行する場合は,次の点に注意してください。