Spring JNDI之Tomcat配置

來源:互聯網
上載者:User

tomcat jndi + spring配置

一、簡介

JNDI : Java Naming and Directory Interface (JNDI)

首先關於jndi的配置網上資料很多,但大多都不是我想要的,原因很簡單,改的設定檔太多,耦合度還是太高。

據網上資料所言,需要更改的設定檔有三:tomcat的server.xml,工程下的WEB-INF/web.xml和spring的資料來源bean的配置。雖然只有三個,但在我看來還是太多,WEB-INF/web.xml是及其不願意經常改動的。於是就有了以下的方案,只需改動tomcat配置和spring的配置,步驟有二。

1、更改tomcat的server.xml或context.xml

2、配置spring資料來源bean

二、JNDI配置

1、更改tomcat的server.xml或context.xml

在context.xml的根節點Context裡加入Resource配置;如果需要配置全域的 Resource,則在server.xml的GlobalNamingResources節點裡加入Resource,再在Context節點裡加入ResourceLink的配置。全域的resource只是為了重用,方便所有該tomcat下的web工程的資料來源管理,但如果你的tomcat不會同時載入多個web工程,也就是說一個tomcat只載入一個web工程時,是沒有必要配置全域的resource的。

<Resource name="jdbc/testDB"//指定的jndi名稱,會用於spring資料來源bean的配置和ResourceLink的配置
type="javax.sql.DataSource"//資料來源床型,使用標準的javax.sql.DataSource
driverClassName="com.mysql.jdbc.Driver"//JDBC磁碟機

url="jdbc:mysql://localhost:3306/test"//資料庫URL地址

username="test"//資料庫使用者名稱
password="test"//資料庫密碼
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,把全域的resource直接公開給該tomcat下的所有web工程,在Context節點中加入:

<ResourceLink global="jdbc/testMDB"
name="jdbc/testMDB" type="javax.sql.DataSource"/>

b)tomcat安裝目錄下的conf/server.xml,該方法可以指定把哪些source綁定到哪個web工程下,但貌似tomcat6.0不支援,tomcat5.5倒可以。

<!-- 新增,第一行為載入的工程配置,第二行是該工程需要的ResourceLink配置 -->
<contextdocBase="/web/webapps/phoenix"path=""reloadable="false">
<ResourceLink global="jdbc/testMDB"
name="jdbc/testMDB" type="javax.sql.DataSource"/>
</context>

c)安裝目錄下的conf/localhost/下建立一個xml檔案,檔案名稱是<yourAppName>.xml。比如工程名為test,則該xml名為test.xml。

<?xml version="1.0" encoding="UTF-8"?>
<Context>
<ResourceLink global="jdbc/testMDB" name="jdbc/testMDB"
type="javax.sql.DataSource"/>
</context>

d)tomcat安裝目錄下的\webapps\test\META-INF\context.xml的Context節點中增加:

<ResourceLink global="jdbc/testMDB" name="jdbc/testMDB"
type="javax.sql.DataSource"/>

綜上所述,a方法還不如直接把resource定義在context.xml中,免去ResourceLink 配置,也就少了犯錯的可能;b、c、d就看個人習慣了,個人還是偏向把所有的resource配置在context.xml中,即方便管理又少了配置。

2、配置spring資料來源bean,相當的簡單。

<bean id="testDataSource"class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName">
<value>java:comp/env/jdbc/testDB</value>
</property>
</bean>

ok,配置完成了,至於之後該如何取到這個bean,就不是這次討論的內容了。

三、常見的報錯及解決方案

再看看通常會報的錯及解決方案吧。

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.GlobalResourcesLifecycleListener
createMBeans
嚴重: Exception processing Global JNDI Resources
javax.naming.NamingException: Could not load resource factoryclass
[Root exception is java.lang.ClassNotFoundException:
org.apache.commons.dbcp.BasicDataSourceFactory]
……

問題描述:這是找不到org.apache.commons.dbcp.BasicDataSourceFactory類,這個類在commons-dbcp.jar中,這jar包時放在工程的WEB-INF/lib下的,而不是tomcat的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.NameNotFoundException: Name memberMDB is not bound in this Context
問題描述:大多數是因為配置了全域的resource,但沒有link造成的。全域resource就是配置在server.xml中GlobalNamingResources節點裡的Resource,這種Resource還需要再在Context節點中配置一個ResourceLink,把全域的resource綁定到工程的局部配置中。
解決方案:見上面步驟1中的ResourceLink配置,這裡有a\b\c\d四種方法。

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.1.5-bin.jar。
解決方案:把工程WEB-INF/lib下的mysql-connector-java-5.1.5-bin.jar copy到tomcat的lib下。

over……

另附上官方文檔:http://tomcat.apache.org/tomcat-6.0-doc/jndi-resources-howto.html

 

 

 

轉載請標明出處http://blog.csdn.net/shimiso 

歡迎有識之士加入我們的技術交流群:173711587

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.