通俗解釈JNDI


JNDI
Javaネーミングとディレクトリインタフェース(Java Naming and Directory Interface)であり、J 2 EE仕様において重要な仕様の一つであり、JNDIの意味と役割を徹底的に理解していなければ、J 2 EE、特にEJBの知識を本当に身につけていないと考えている専門家も少なくない.
では、JNDIはいったいどんな役割を果たしているのでしょうか.
JNDIの役割を理解するには、「JNDIを使わなければどうしますか?JNDIを使ったらどうしますか?」この問題について検討する.
JNDIのやり方はありません:
プログラマーが開発する際、MySQLデータベースにアクセスするアプリケーションを開発することを知り、MySQL JDBCドライバクラスへの参照をエンコードし、適切なJDBC URLを使用してデータベースに接続します.
次のコードのようにします.
Connection conn=null;
try {
  Class.forName("com.mysql.jdbc.Driver",
                true, Thread.currentThread().getContextClassLoader());
  conn=DriverManager.getConnection("jdbc:mysql://MyDBServer?user=qingfeng&password=mingyue");
  /*   conn   SQL   */
  ......
  conn.close();
} 
catch(Exception e) {
  e.printStackTrace();
} 
finally {
  if(conn!=null) {
    try {
      conn.close();
    } catch(SQLException e) {}
  }
}

これは伝統的なやり方であり、以前はJavaプログラマー(Delphi、VBなど)ではなかった一般的なやり方でもある.この方法は一般的に小規模な開発過程で問題は発生しません.プログラマーがJava言語を熟知し、JDBC技術とMySQLを理解すれば、すぐに対応するアプリケーションを開発することができます.
JNDIのやり方に問題はありません:
1、データベースサーバー名
MyDBServer
、ユーザー名とパスワードを変更する必要がある場合があります.これにより、JDBC URLの変更が必要になります.
2、データベースはDB 2またはOracleなどの他の製品を変更することができ、JDBCドライバパッケージとクラス名を変更する必要がある.
3、実際の使用端末の増加に伴い、元の構成の接続プールパラメータを調整する必要がある場合がある.
4、......
解決策:
プログラマーは「具体的なデータベースのバックグラウンドは何ですか?JDBCドライバは何ですか?JDBC URLフォーマットは何ですか?データベースにアクセスするユーザー名とパスワードは何ですか?」などの問題があります.プログラマが作成したプログラムには、JDBCドライバへの参照はなく、サーバ名もなく、ユーザー名やパスワードもありません.データベース・プールや接続管理もありません.これらの問題をJ 2 EEコンテナに渡して構成と管理し,プログラマはこれらの構成と管理を参照するだけでよい.
これによって、JNDIがあります.
JNDIを使った後のやり方:
まず、J 2 EEコンテナにJNDIパラメータを配置し、データソース、すなわちJDBC参照パラメータを定義し、このデータソースに名前を設定する.その後、プログラムでは、データソース名でデータソースを参照してバックグラウンド・データベースにアクセスします.
具体的な操作は以下の通りです(JBossを例にとります).
1、データソースの構成
JBossのD:/jboss 420 GA/docs/examples/jcaフォルダの下には、異なるデータベース参照のデータソース定義テンプレートがたくさんあります.その中のmysql-ds.xmlファイルCopyは、D:/jboss 420 GA/server/default/deployなど、使用するサーバの下にあります.
mysql-dsを変更します.xmlファイルの内容は、JDBCでMySQLデータベースに正しくアクセスできるようにします.以下のようにします.
   
MySqlDS    
jdbc:mysql://localhost:3306/lw    
com.mysql.jdbc.Driver    
root    
rootpassword org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter           
mySQL    
ここでは、JDBCのURL、駆動クラス名、ユーザ名、パスワードなどを含むMySqlDSというデータソースを定義します.
2、プログラムでデータソースを参照する:
Connection conn=null;
try {
  Context ctx=new InitialContext();
  Object datasourceRef=ctx.lookup("java:MySqlDS"); //     
  DataSource ds=(Datasource)datasourceRef;
  conn=ds.getConnection();
  /*   conn     SQL   */
  ......
  c.close();
} 
catch(Exception e) {
  e.printStackTrace();
} 
finally {
  if(conn!=null) {
    try {
      conn.close();
    } catch(SQLException e) { }
  }
}

JDBCを直接使用したり、JNDIでデータソースを参照したりするプログラミングコードの量はほとんどありませんが、現在のプログラムでは具体的なJDBCパラメータに関心を持たなくてもいいです.
システムの導入後、データベースの関連パラメータが変更された場合、mysql-dsを再構成するだけです.xmlはJDBCパラメータを変更し、データソースの名前が変わらないことを保証すれば、プログラムソースコードを変更する必要はありません.
このようにJNDIは、プログラムとデータベースの緊密な結合を回避し、アプリケーションの構成を容易にし、導入を容易にします.
JNDIの拡張:
JNDIは、データ・ソース構成の要件を満たした上で、システム外部のすべてのリソースへの参照をJNDIによって定義および参照できる役割をさらに拡張しました.
したがって、J 2 EE仕様では、J 2 EEにおけるリソースはJDBCデータソースに限定されない.参照のタイプには、リソース参照(すでに説明されている)、環境エンティティ、EJB参照などがあります.特にEJB参照では、J 2 EEにおけるJNDIのもう一つの重要な役割:他のアプリケーションコンポーネントを検索することを暴露しています.
EJBのJNDIリファレンスは、JDBCリソースのリファレンスと非常に類似しています.サービスが転換する環境では、これは有効な方法です.このような構成管理は、EJBコンポーネントからJMSキューやトピック、文字列やその他のオブジェクトの単純な構成まで、アプリケーション・アーキテクチャで得られるすべてのコンポーネントに対して行うことができます.これにより、時間の経過とともにサービスの変更に伴うメンテナンスコストを削減し、導入を簡素化し、統合作業を削減できます.外部リソース」. 
まとめ:
J 2 EE仕様はすべてのJ 2 EE容器にJNDI仕様の実現を提供することを要求する.JNDIのJ 2 EEでの役割は「スイッチ」--J 2 EEコンポーネントが実行時間に他のコンポーネント、リソース、またはサービスを接地して検索する共通のメカニズムである.多くの場合、JNDIプロバイダを提供するコンテナは限られたデータストレージとして機能し、管理者はアプリケーションの実行属性を設定し、他のアプリケーションにこれらの属性を参照させることができる(Java Management Extensions,JMX)もこの目的として使用できる).JNDIのJ 2 EEアプリケーションでの主な役割は間接層を提供することであり、コンポーネントはこれらの間接性を理解することなく、必要なリソースを発見することができる.
J 2 EEでは、JNDIはJ 2 EEアプリケーションを結合した接着剤であり、JNDIが提供する間接アドレスは、企業間で伸縮性があり、機能が強く、柔軟なアプリケーションを提供することができる.これはJ 2 EEの承諾であり、いくつかの計画と事前の考慮を経て、この承諾は完全に実現することができる.
変換元:http://blog.csdn.net/zhaosg198312/article/details/3979435