Tomcat 5 與 6 的 JNDI 資源定義位置不同,導致 Spring 專案遷移常見 NameNotFoundException。本文對比兩版本正確配置。
Tomcat/lib/ (非專案 WEB-INF/lib)JndiObjectFactoryBean 統一查找 java:comp/env/jdbc/mldn<Context path="/zhinangtuan" docBase="..." debug="5" reloadable="true" crossContext="true">
<Resource name="jdbc/mldn" auth="Container" type="javax.sql.DataSource"/>
<ResourceParams name="jdbc/mldn">
<parameter><name>factory</name><value>org.apache.commons.dbcp.BasicDataSourceFactory</value></parameter>
<parameter><name>driverClassName</name><value>org.gjt.mm.mysql.Driver</value></parameter>
<parameter><name>url</name><value>jdbc:mysql://localhost:3306/mldn</value></parameter>
<parameter><name>username</name><value>root</value></parameter>
<parameter><name>password</name><value>mysqladmin</value></parameter>
<parameter><name>maxActive</name><value>100</value></parameter>
<parameter><name>maxIdle</name><value>30</value></parameter>
<parameter><name>maxWait</name><value>5000</value></parameter>
</ResourceParams>
</Context>
<Context>
<Resource name="jdbc/mldn"
auth="Container"
type="javax.sql.DataSource"
factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/mldn?useUnicode=true&characterEncoding=utf-8"
username="root"
password="123"
maxActive="100"
maxIdle="30"
maxWait="10000" />
</Context>
| 項目 | Tomcat 5 | Tomcat 6 |
|---|---|---|
| 資源定義位置 | server.xml <Context> 內 | context.xml (全域或 META-INF/context.xml) |
| DBCP 工廠類 | commons.dbcp.BasicDataSourceFactory | tomcat.dbcp.dbcp.BasicDataSourceFactory |
| ResourceParams | 獨立元素 | 合併為 Resource 屬性 |
| web.xml resource-ref | 建議宣告 | 可選 (Tomcat 6 自動掃描) |
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean" destroy-method="close">
<property name="jndiName" value="java:comp/env/jdbc/mldn"/>
</bean>
遷移核心:將資源定義從 server.xml 移至 context.xml,更新工廠類全名,屬性扁平化。建議使用
META-INF/context.xml隨專案部署,避免修改全域配置。