从WAS 8.5.5迁移至Tomcat 8.0.33时远程访问JNDI树受阻求助
解决WAS到Tomcat迁移中JNDI数据源查找的问题
看起来你在把WebSphere Application Server (WAS) 8.5.5上的应用迁移到Tomcat 8.0.33时,卡在了JNDI数据源查找这一步——毕竟WAS和Tomcat的JNDI实现差异确实挺大的,尤其是你原来用的是RMI远程JNDI,而Tomcat默认是本地JNDI上下文,直接照搬WAS的代码肯定跑不起来。我来给你一步步拆解解决方案:
核心问题根源
Tomcat的默认JNDI实现是本地上下文,并不像WAS那样默认提供RMI远程JNDI服务。你代码里配置的org.apache.naming.java.javaURLContextFactory和rmi://localhost:1099其实是Tomcat远程JNDI的配置,但Tomcat默认没开启这个服务,而且大多数场景下Tomcat应用也不需要用远程JNDI来查找本地数据源。
步骤1:配置Tomcat的本地数据源
首先你得在Tomcat里配置好数据源,有两种常用方式:
方式A:全局配置(server.xml)
在Tomcat的conf/server.xml里的<GlobalNamingResources>节点下添加数据源配置:
<Resource name="jdbc/YourDataSourceName" auth="Container" type="javax.sql.DataSource" driverClassName="com.mysql.jdbc.Driver" <!-- 替换成你的数据库驱动类 --> url="jdbc:mysql://localhost:3306/your_db" <!-- 替换成你的数据库URL --> username="db_user" password="db_pass" maxTotal="100" maxIdle="30" maxWaitMillis="10000" />
然后在conf/context.xml里添加链接,让应用能访问这个全局资源:
<ResourceLink name="jdbc/YourDataSourceName" global="jdbc/YourDataSourceName" type="javax.sql.DataSource" />
方式B:应用本地配置(META-INF/context.xml)
如果不想修改Tomcat全局配置,也可以在你的应用的META-INF目录下新建context.xml,直接添加数据源:
<Context> <Resource name="jdbc/YourDataSourceName" auth="Container" type="javax.sql.DataSource" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/your_db" username="db_user" password="db_pass" maxTotal="100" maxIdle="30" maxWaitMillis="10000" /> </Context>
步骤2:修改你的DataSourceManager代码适配Tomcat
不需要再配置RMI相关的属性了,Tomcat本地JNDI上下文默认就能直接查找,简化后的代码应该是这样:
import javax.naming.InitialContext; import javax.sql.DataSource; public class DataSourceManager { public static DataSource getDataSource() throws Exception { // 直接初始化默认上下文,不需要额外配置RMI属性 InitialContext context = new InitialContext(); // 注意这里的名称要和你Tomcat配置里的name一致,前缀java:comp/env/是Tomcat的标准JNDI命名空间 DataSource dataSource = (DataSource) context.lookup("java:comp/env/jdbc/YourDataSourceName"); return dataSource; } }
步骤3:确保数据库驱动包正确放置
Tomcat需要数据库驱动包来创建数据源,注意:
- 如果是全局配置的数据源,驱动包要放在Tomcat的
lib目录下 - 如果是应用本地配置的数据源,驱动包可以放在应用的
WEB-INF/lib目录下
常见问题排查
- 如果遇到
NameNotFoundException:检查JNDI名称是否完全匹配,尤其是java:comp/env/前缀不能少,Tomcat的应用本地JNDI资源都在这个命名空间下 - 如果遇到
ClassNotFoundException:检查数据库驱动包是否放对了位置,版本是否兼容Tomcat 8.0.33 - 如果一定要用远程JNDI(不推荐,除非有特殊需求):需要修改Tomcat的
conf/server.xml开启RMI服务,配置GlobalNamingResources的factory属性,同时确保防火墙开放1099端口,但这种场景在Tomcat里很少用,本地JNDI足够满足大多数应用需求
内容的提问来源于stack exchange,提问作者Deepam Singla
相关产品推荐
相关产品推荐

