Tomcat 9.x JNDI外部查询:如何配置数据源并实现外部访问
Tomcat 9.x 外部访问数据源配置指南
一、Tomcat服务器端配置
1. 配置全局数据源
在Tomcat的conf/context.xml文件中,将以下<Resource>节点添加到<Context>标签内,替换为你的数据库实际信息:
<Resource name="jdbc/ordering" auth="Container" type="javax.sql.DataSource" driverClassName="com.mysql.cj.jdbc.Driver" <!-- 替换为对应数据库驱动类 --> url="jdbc:mysql://localhost:3306/your_db?useSSL=false&serverTimezone=UTC" <!-- 替换为数据库连接URL --> username="db_user" <!-- 替换为数据库账号 --> password="db_pass" <!-- 替换为数据库密码 --> maxTotal="100" <!-- 最大连接数 --> maxIdle="30" <!-- 最大空闲连接数 --> maxWaitMillis="10000" <!-- 获取连接超时时间(毫秒) --> />
name属性需与客户端lookup的JNDI名称保持一致(即java:jdbc/ordering中的jdbc/ordering)。- 若使用Oracle、SQL Server等其他数据库,需同步修改
driverClassName和url参数。
2. 开启远程JNDI访问
Tomcat默认仅允许本地访问JNDI,需通过JMX配置开启远程访问:
- Linux/macOS:编辑
bin/catalina.sh,在文件开头添加:CATALINA_OPTS="-Djava.rmi.server.hostname=你的Tomcat服务器IP -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false" - Windows:编辑
bin/catalina.bat,在文件开头添加:set CATALINA_OPTS=-Djava.rmi.server.hostname=你的Tomcat服务器IP -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false
注意:上述配置仅适用于测试环境,生产环境必须开启SSL加密和用户认证,避免未授权访问风险。
二、客户端代码调整
你原代码的上下文工厂和Provider URL配置有误,修改后的可用代码如下:
import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; import javax.sql.DataSource; import java.sql.Connection; import java.sql.SQLException; import java.util.Properties; public class ExternalDataSourceClient { public static void main(String[] args) throws NamingException, SQLException { Properties props = new Properties(); // 指定Tomcat远程JNDI上下文工厂 props.setProperty(Context.INITIAL_CONTEXT_FACTORY, "org.apache.naming.factory.UrlContextFactory"); // 替换为你的Tomcat服务器IP和配置的JMX端口 props.setProperty(Context.PROVIDER_URL, "rmi://你的Tomcat服务器IP:1099"); // 若Tomcat开启了JNDI认证,添加以下两行 // props.setProperty(Context.SECURITY_PRINCIPAL, "认证用户名"); // props.setProperty(Context.SECURITY_CREDENTIALS, "认证密码"); InitialContext ctx = new InitialContext(props); // lookup名称需与Tomcat中配置的Resource name完全匹配 DataSource ds = (DataSource) ctx.lookup("java:jdbc/ordering"); Connection conn = ds.getConnection(); // 执行数据库操作... conn.close(); ctx.close(); } }
三、客户端依赖准备
客户端项目必须引入以下Jar包(版本需与Tomcat 9.x保持一致):
tomcat-jndi.jartomcat-catalina.jartomcat-util.jar- 对应数据库的驱动Jar包(如
mysql-connector-java.jar)
四、注意事项
- 确保Tomcat服务器的JMX端口(默认1099)已对外开放,防火墙允许客户端访问该端口。
- 客户端Jar包版本必须与Tomcat服务器版本一致,否则会出现类加载或上下文初始化异常。
- 生产环境务必配置JMX的SSL加密和用户认证,防止数据源信息泄露。
- 若遇到
NamingException,优先检查JNDI名称是否与Tomcat配置一致,以及网络连接是否正常。
内容的提问来源于stack exchange,提问作者Subcomandante
相关产品推荐
相关产品推荐

