tomcat jndi+spring構成


tomcat jndi+spring構成
 
一、紹介
     JNDI : Java Naming and Directory Interface (JNDI)
まずjndiに関する構成はネット上の資料が多いが、多くは私が望んでいるものではない.理由は簡単で、変更された構成ファイルが多すぎて、結合度が高すぎる.
ネット上の資料によると、変更するプロファイルはtomcatのserverの3つある.xml,工程下のWEB-INF/web.xmlとspringのデータソースbeanの構成.三つしかありませんが、私から見ればまだ多すぎます.WEB-INF/web.xmlは常に変更したくないものです.そこで、tomcat構成とspringの構成を変更するだけで、ステップは2つあります.
1、tomcatのserverを変更する.xmlまたはcontext.xml
2、springデータソースbeanの構成
二、JNDI配置
1、tomcatのserverを変更する.xmlまたはcontext.xml
場所xmlのルートノードContextにResource構成を追加します.グローバルなResourceを構成する必要がある場合はserver.xmlのGlobalNamingResourcesノードにResourceを追加し、ContextノードにResourceLinkの構成を追加します.グローバルなresourceは、tomcatの下にあるすべてのWebプロジェクトのデータソース管理を容易にするために再利用されますが、tomcatが複数のWebプロジェクトを同時にロードしない場合は、1つのtomcatが1つのWebプロジェクトだけをロードする場合は、グローバルなresourceを構成する必要はありません.
 
<Resource  name="jdbc/testDB"  //   jndi  ,   spring   bean    ResourceLink   
               type="javax.sql.DataSource"  //     ,     javax.sql.DataSource
               driverClassName="oracle.jdbc.driver.OracleDriver"   
               url="jdbc:oracle:thin:@localhost:1521:XE"      
               username="system"    
               password="623582fade"  
               maxIdle="40"   
               maxWait="4000" 
               maxActive="250" 
               removeAbandoned="true" 
               removeAbandonedTimeout="180"
               logAbandoned="true" //              ,    
               factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory" />
 
 
 
ここでfactoryとは、そのResource構成で使用するデータソース構成クラスのことであり、ここではtomcatが持参する標準データソースResource構成クラスを使用する、このクラスは自分で書いてjavaxを実現することもできる.naming.spi.ObjectFactoryインタフェースでいいです.いくつかの場所で使用されているcommons-dbcp.JArのorg.apache.commons.dbcp.BasicDataSourceFactory、これを使うならcommons-dbcp.jarとその依存jarパッケージは、tomcatのlibの下に置かれ、工事のWEB-INF/libの下に置くだけでは足りない.
ResourceLinkの構成はいくつかあります.
a)tomcatインストールディレクトリの下のconf/context.xmlは、tomcatの下にあるすべてのWebプロジェクトにグローバルなresourceを直接公開し、Contextノードに追加します.
<ResourceLink global="jdbc/testDB" name="jdbc/testDB" type="javax.sql.DataSource"/> 

b)tomcatインストールディレクトリの下のconf/server.xml、この方法はどのsourceをどのwebプロジェクトの下にバインドするかを指定することができますが、tomcat 6のようです.0はサポートされていませんtomcat 5.5はいいです.テストはtomcat 6.0.32いいえ
<context docBase="springmvc-web" path="/springmvc-web"  debug="5" reloadable="true" crossContext="true"> 
			 <ResourceLink global="jdbc/testDB" name="jdbc/testDB" type="javax.sql.DataSource"/>
		</context>
 
 
c)インストールディレクトリの下のconf/localhost/の下にxmlファイルを作成し、ファイル名は.xml.例えばプロジェクト名はspringmvc-webです.xmlはspringmvc-webという名前です.xml.
 
<?xml version="1.0" encoding="UTF-8"?>
<Context>   
     <ResourceLink global="jdbc/testDB" name="jdbc/testDB" type="javax.sql.DataSource"/> 
</Context>
 
 
 
d)tomcatインストールディレクトリの下のwebappsspringmvc-webMETA-INFcontext.xmlのContextノードに追加:
<ResourceLink global="jdbc/testDB" name="jdbc/testDB" type="javax.sql.DataSource"/>

以上のように、a方法はresourceをcontextに直接定義するほうがよい.xmlでは、ResourceLink構成を免除することで、間違いを犯す可能性が少なくなります.b、c、dは個人の習慣によって、個人はやはりすべてのresourceをcontextに配置することに偏っている.xmlでは、管理が容易で構成が少なくなります.
2、springデータソースbeanの構成は、かなり簡単です.
<!--   JNDI      -->
	<bean id="dataSourse" class="org.springframework.jndi.JndiObjectFactoryBean">
		<property name="jndiName" value="java:comp/env/jdbc/testDB"/>  
	</bean>

 
OK、構成が完了しました.その後、このbeanをどのように取るかについては、今回の議論の内容ではありません.java:comp/envは必須です
三、よくあるエラー報告と解決方案
通常報告される間違いや解決策を見てみましょう.
   1、java.lang.ClassNotFoundException: org.apache.commons.dbcp.BasicDataSourceFactory
エラーの詳細:
...警告:Failed to register in JMX:javax.naming. NamingException : Could not load resource factory class [Root exception is java.lang. ClassNotFoundException : org.apache.commons.dbcp.BasicDataSourceFactory]2010-1-18 13:22:37 org.apache.catalina.mbeans.GlobalResources LifecycleListener createMBeans重症:Exception processing Global JNDI Resourcesjavax.naming. NamingException : Could not load resource factory class [Root exception is java.lang. ClassNotFoundException : org.apache.commons.dbcp.BasicDataSourceFactory]……
質問説明:orgが見つからない.apache.commons.dbcp.BasicDataSourceFactoryクラス、このクラスはcommons-dbcp.JArでは、このjarパッケージはtomcatのlibではなく、エンジニアリングのWEB-INF/libの下に置かれていますが、tomcatの起動時に自身の構成(server.xmlなど)を読み取り、エンジニアリングのlibではなくtomcatが持参したlibを使用しているので、必ずエラーが発生します.このパッケージをtomcatのlibの下にコピーしてもだめです.commons-dbcpですから.JArは他のjarパケットと一定の依存関係がある.ソリューション:tomcat jndi構成のfactory="org.apache.commons.dbcp.BasicDataSourceFactory"をtomcatが持参するfactory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory"に変更します.
    2、Caused by: javax.naming.Name NotFoundException:Name memberMDB is not bound in this Context問題の説明:ほとんどはグローバルなresourceが構成されているがlinkがないためです.グローバルresourceはserverに構成されています.xmlのGlobalNamingResourcesノードのResourceです.このResourceはContextノードにResourceLinkを構成し、グローバルなresourceをエンジニアリングのローカル構成にバインドする必要があります.ソリューション:上記の手順1のResourceLink構成を参照してください.ここにはabcdの4つの方法があります.
   3、Cannot load JDBC driver class 'com.mysql.jdbc.Driver' java.lang.ClassNotFoundException: com.mysql.jdbc.Driver問題の説明:jndiの構成はmysqlのドライブを使う必要があるため、tomcatのlibの下でmysqlドライブのjarパッケージを加える必要があります.私はmysql-connector-java-5.15-binを使っています.jar.解決策:工事WEB-INF/libの下のmysql-connector-java-5.15-bin.JAr copyはtomcatのlibの下にあります.
   over
公式文書を添付:http://tomcat.apache.org/tomcat-6.0-doc/jndi-resources-howto.html