Jboss/Tomcat/Jettyに関するJNDI定義123

4672 ワード

しばらくここに来ていないようです。今日は暇を見つけてから、この三つのサーバーがJNDIを配置する時の異同点を確認して、自分の提案を提出します。
•Jboss 4
    JbossにJNDIを配置するのに最も一般的なのはデータソースを配置する時、server/default/deployディレクトリの下にあるxx-ds.xmlファイルの内容は以下の通りです。
01.<?xml version="1.0" encoding="UTF-8"?>  
02.<datasources>  
03.  <local-tx-datasource>  
04.      <jndi-name>jdbc/DataSource</jndi-name>  
05.      <connection-url>jdbc:jtds:sqlserver://localhost:1433/fnx</connection-url>   
06.      <driver-class>net.sourceforge.jtds.jdbc.Driver</driver-class>  
07.      <user-name>sa</user-name>  
08.      <password>1234</password>  
09.     <metadata>  
10.     <type-mapping>MS SQLSERVER2000</type-mapping>  
11.     </metadata>  
12.     </local-tx-datasource>  
13.</datasources>  
このようにサーバーを起動したら、webアプリケーションで次のコードを通じて直接データソースにアクセスできます。
01.Context ctx = new InitialContext();  
02.Object o=ctx.lookup("java:jdbc/DataSource");  
しかし、ここのjava:jdbc/DataSourceはグローバル資源の名前です。Jbossは自動的に資源をグローバル資源に入れています。私たちはよく使う中で見られるjava:comp/env/jdbc/DataSourceはどういうことですか?これは実は応用です
のプライベート環境引用名を使用するには、2つのことを行う必要があります。1、アプリケーションのWEB-INFディレクトリの下でjboss-web.xmlを作成し、グローバルから局部への参照名のマッピングを設定します。
01.<jboss-web>  
02.    <resource-ref>  
03.        <res-ref-name>jdbc/DataSource</res-ref-name>  
04.        <res-type>javax.sql.DataSource</res-type>  
05.        <jndi-name>java:/jdbc/DataSource</jndi-name>  
06.    </resource-ref>     
07. <context-root>/</context-root>  
08.</jboss-web> 
2、web.xmlに設定する
01.<web-app>  
02.  <display-name>Archetype Created Web Application</display-name>  
03.    
04.  <resource-ref>  
05.<description>dataSource</description>  
06.<res-ref-name>jdbc/DataSource</res-ref-name>  
07.<res-type>javax.sql.DataSource </res-type>  
08.<res-auth>Container</res-auth>  
09. </resource-ref>   
10.</web-app> 
ウェブアプリケーションでjava:comp/env/jdbc/DataSourceのプライベート名を使うことができます。
•Tomcat 6
tomcatにJNDIを配置するところは3つあります。
1、サーバーのServer元素の下にグローバルなJNDI<Global NamingResource>を配置する。
2、host要素の<DefaultContext>に配置し、配置後に当該hostの下のすべてのcontextに適用するのは有効です。
3、context元素の下で配置し、ここで構成されているのはこのアプリケーションに対してのみ有効です。
第一の方式で構成されたグローバルJNDIは、contextで<Resource Link>要素をローカル名に変換して使用する必要があり、jboss-web.xmlの変換と同様の機能が必要です。また、tomcatに配置されたリソースはweb.xmlで声明する必要はなく、java:comp/envでアクセスすることもできます。これはJboss/jeyとは違います。
  上の3つの場所に配置できるリソース要素はResource/Evironmentであり、Resource ParamsはResourceに合わせて使用され、Resource Linkは接続のためにグローバルリソースを変換する。
簡単な例を挙げて、context元素の下の配置:(他の皆さんは自分で元素を見に行ってどう使いますか?)
01.<Resource name="mybase" auth="Container"  
02.            type="org.apache.catalina.UserDatabase"  
03.            description="User database that can be updated and saved"  
04.            factory="org.apache.catalina.users.MemoryUserDatabaseFactory"  
05.            pathname="conf/tomcat-users.xml" />  
これで直接ウェブでjava:comp/env/mybaseを使って資源を調べられます。でも、web.xmlの中で声明することをオススメします。
•Jetty 7
JettyのJNDI配置も3つの範囲に分けられます。
1、JVMグローバルに基づいて、同じJVMの下で異なるServerにアクセスできます。
2、Serverに基づいて、このserverでしかアクセスできません。
3、アプリケーションcontextコンテキストに基づいて、このcontextでしかアクセスできない
配置方式は前の編の「JNDIとJETTYでの運用」に見てください。
ただし、ここで注意したいのは、java:comp/env方式でアクセスする場合、必ずweb.xmlに資源を宣言してください。
•まとめ
すべてのサーバーは彼自身のJNDI構成とグローバルアクセス方式を持っています。もし私達が直接グローバルアクセス方式を採用すれば、第一に、いくつかのアプリケーションに関するリソース構成だけにはアクセスできないかもしれません。
アプリケーションサーバの全体的なアクセス方式はあまり一致していないかもしれません。したがって、アプリケーションでは、プライベートな方法でリソースにアクセスし、どうしてもweb.xmlで説明することが推奨されています。これは良い習慣です。
また、プライベート環境ENC(java:comp/env)といえば、彼はどうやってプライベートになったのですか?実はプライベートは各アプリケーションのコンテキストにとって、一般的に各アプリケーションのコンテキストは自分のクラスリーダーを使ってアプリケーションをロードします。したがって、クラスloaderを利用して完成できます。具体的には、各アプリケーションのコンテキストcloassis loaderでJNDI contextを初期化し、classoaderをkeyとして保存し、以降検索を適用する際に使用する必要があるコンテキストのclassloaderを使ってこのJNDIリソースを検索すればいいです。他のアプリケーションは異なるclassloaderのインスタンスを使うので、互いに共有できなくなります。これはすべてのアプリケーションのプライベートです。また、資源名は、java:resource Nameまたはprefix:resource Nameの方式を採用していますが、java:resource Nameまたはprefix:resource Nameを通じて直接訪問することができますが、これはプライベートリソースではなく、すべてのアプリケーションにアクセスできます。ENCにバインドされたアクセス:java:comp/env/prefix:resource Name
【転載】http://blog.csdn.net/lovingprince/article/details/6577920