You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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&amp;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.jar
  • tomcat-catalina.jar
  • tomcat-util.jar
  • 对应数据库的驱动Jar包(如mysql-connector-java.jar)

四、注意事项

  • 确保Tomcat服务器的JMX端口(默认1099)已对外开放,防火墙允许客户端访问该端口。
  • 客户端Jar包版本必须与Tomcat服务器版本一致,否则会出现类加载或上下文初始化异常。
  • 生产环境务必配置JMX的SSL加密和用户认证,防止数据源信息泄露。
  • 若遇到NamingException,优先检查JNDI名称是否与Tomcat配置一致,以及网络连接是否正常。

内容的提问来源于stack exchange,提问作者Subcomandante

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 01:35:26