Spring Boot外部Tomcat配置JNDI数据源失败求助
我之前配置Tomcat JNDI数据源的时候也踩过不少坑,大概率是Tomcat端的配置没到位或者Spring代码里的细节没注意到,咱们一步步来解决:
1. 先搞定Tomcat端的数据源配置
首先得在Tomcat里把数据源定义好,有两种方式可选,看你的需求:
方式一:全局数据源(所有webapp共享)
编辑Tomcat安装目录下的conf/server.xml,找到<GlobalNamingResources>节点,加入以下Resource配置:
<Resource name="jdbc/MyDB" auth="Container" type="javax.sql.DataSource" driverClassName="com.mysql.cj.jdbc.Driver" <!-- 替换为你的数据库驱动类 --> url="jdbc:mysql://localhost:3306/your_database_name" <!-- 替换为你的数据库地址 --> username="db_username" password="db_password" maxTotal="100" <!-- 最大连接数 --> maxIdle="20" <!-- 最大空闲连接数 --> maxWaitMillis="10000" <!-- 获取连接的超时时间 --> />
然后在你的webapp的META-INF/context.xml里添加ResourceLink,把全局资源映射到当前应用的命名空间:
<ResourceLink name="jdbc/MyDB" global="jdbc/MyDB" type="javax.sql.DataSource"/>
方式二:单应用专属数据源
如果只需要当前应用使用这个数据源,直接在你的webapp的META-INF/context.xml里配置Resource即可,无需修改server.xml:
<Resource name="jdbc/MyDB" auth="Container" type="javax.sql.DataSource" driverClassName="com.mysql.cj.jdbc.Driver" url="jdbc:mysql://localhost:3306/your_database_name" username="db_username" password="db_password" maxTotal="100" maxIdle="20" maxWaitMillis="10000" />
2. 调整Spring的DatabaseConfig代码
你原来的代码已经用了JndiDataSourceLookup,但差了关键配置,修改后的代码应该是这样的:
@Bean public DataSource dataSource() { final JndiDataSourceLookup dsLookup = new JndiDataSourceLookup(); // 关键设置:设为true后,Tomcat会自动处理java:comp/env前缀 dsLookup.setResourceRef(true); // 这里的名称要和Tomcat里配置的name完全一致,大小写敏感! return dsLookup.getDataSource("jdbc/MyDB"); }
或者用更简洁的@JndiLookup注解方式:
@Bean @JndiLookup(jndiName = "java:comp/env/jdbc/MyDB") public DataSource dataSource() { return null; // Spring会自动从JNDI获取数据源,这里返回null即可 }
3. 排查最容易踩的坑
- 数据库驱动要放对位置:把数据库驱动jar包(比如mysql-connector-java-x.x.x.jar)放到Tomcat的
lib目录下,绝对不能放在webapp的WEB-INF/lib里,否则Tomcat启动时找不到驱动类,会报ClassNotFoundException。 - 名称必须完全匹配:Tomcat里配置的
name和Spring里lookup的名称要一模一样,大小写都不能错,比如Tomcat里是jdbc/MyDB,Spring里就不能写成jdbc/mydb。 - Spring Boot项目需排除自动配置:如果你的项目是Spring Boot,一定要排除自动配置的数据源,否则Spring会优先用自己的配置,加上这个注解:
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
- 查看日志定位问题:如果还是失败,去看Tomcat的
logs/catalina.log或者localhost.log,里面会有详细的错误信息,比如“找不到JNDI资源”“驱动类加载失败”之类的,根据日志就能快速定位问题。
如果按照上面的步骤来,应该就能成功从Tomcat获取JNDI数据源了,要是还有具体的错误,把日志贴出来咱们再细化排查~
内容的提问来源于stack exchange,提问作者RITZ XAVI
相关产品推荐
相关产品推荐

