1. 首页 > Tomcat教程 > 正文

Tomcat教程FG009-Tomcat JNDI资源配置与自定义资源实战

目录大纲

Part01-基础概念与理论知识

1.1 JNDI简介

JNDI(Java Naming and Directory Interface)是Java平台的一个标准服务,用于访问命名和目录服务。在Tomcat中,JNDI提供了一种统一的方式来访问各种资源,如数据库连接、邮件会话、自定义资源等。

JNDI的主要功能:

  • 命名服务:将对象与名称绑定,通过名称查找对象
  • 目录服务:在命名服务的基础上,提供对象的属性查询
  • 资源管理:集中管理应用所需的各种资源

1.2 Tomcat JNDI资源类型

Tomcat支持多种类型的JNDI资源:

  • 数据源(DataSource):数据库连接池
  • 邮件会话(MailSession):邮件发送服务
  • 自定义资源:用户自定义的资源
  • 环境变量:应用配置参数
  • JavaBean:Java对象资源

1.3 JNDI资源配置原理

Tomcat JNDI资源配置的原理:

  • 在server.xml或context.xml中配置资源
  • 资源被注册到JNDI命名空间
  • 应用通过JNDI API查找和使用资源
  • 资源可以是全局的(所有应用共享)或应用级的(仅当前应用使用)

更多视频教程www.fgedu.net.cn

Part02-生产环境规划与建议

2.1 环境准备

环境准备要求:

  • Tomcat 11.0.8或更高版本
  • 数据库(配置数据源时需要)
  • 邮件服务器(配置邮件会话时需要)
  • 适当的资源配置参数

2.2 配置建议

JNDI资源配置建议:

  • 使用全局资源配置共享资源
  • 配置适当的连接池参数
  • 使用环境变量存储敏感信息
  • 定期监控资源使用情况
  • 备份资源配置

2.3 性能优化

性能优化建议:

  • 配置适当的连接池大小
  • 设置合理的连接超时时间
  • 启用连接池监控
  • 优化资源初始化参数
  • 使用连接池验证机制

学习交流加群风哥微信: itpux-com

Part03-生产环境项目实施方案

3.1 全局JNDI资源配置

# 编辑server.xml文件,配置全局JNDI资源
vi /Tomcat/app/conf/server.xml



type=”org.apache.catalina.UserDatabase”
description=”User database that can be updated and saved”
factory=”org.apache.catalina.users.MemoryUserDatabaseFactory”
pathname=”conf/tomcat-users.xml” />


type=”javax.sql.DataSource” driverClassName=”com.mysql.cj.jdbc.Driver”
url=”jdbc:mysql://localhost:3306/fgedudb?useSSL=false&serverTimezone=UTC”
username=”fgedu” password=”fgedu123″ maxTotal=”20″ maxIdle=”10″
maxWaitMillis=”10000″ />


type=”javax.mail.Session”
mail.smtp.host=”smtp.fgedu.net.cn”
mail.smtp.port=”25″
mail.smtp.auth=”true”
mail.smtp.user=”admin@fgedu.net.cn”
mail.smtp.password=”mail123″ />

3.2 应用级JNDI资源配置

# 编辑应用的context.xml文件,配置应用级JNDI资源
vi /Tomcat/app/webapps/fgedu-webapp/META-INF/context.xml






3.3 自定义资源配置

自定义资源配置步骤:

  1. 创建自定义资源类
  2. 配置资源工厂
  3. 在context.xml中配置资源
  4. 在应用中使用资源

from Tomcat视频:www.itpux.com

Part04-生产案例与实战讲解

4.1 数据源配置实战

# 下载MySQL驱动
wget https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-j-8.0.33.tar.gz
–2026-04-10 12:00:00– https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-j-8.0.33.tar.gz
Resolving dev.mysql.com (dev.mysql.com)… 137.254.60.11
Connecting to dev.mysql.com (dev.mysql.com)|137.254.60.11|:443… connected.
HTTP request sent, awaiting response… 302 Found
Location: https://cdn.mysql.com//Downloads/Connector-J/mysql-connector-j-8.0.33.tar.gz [following]
–2026-04-10 12:00:01– https://cdn.mysql.com//Downloads/Connector-J/mysql-connector-j-8.0.33.tar.gz
Resolving cdn.mysql.com (cdn.mysql.com)… 23.213.161.175
Connecting to cdn.mysql.com (cdn.mysql.com)|23.213.161.175|:443… connected.
HTTP request sent, awaiting response… 200 OK
Length: 24736432 (24M) [application/x-gzip]
Saving to: ‘mysql-connector-j-8.0.33.tar.gz’

mysql-connector-j-8.0.33.tar.gz 100%[====================================>] 23.60M 10.2MB/s in 2.3s

2026-04-10 12:00:04 (10.2 MB/s) – ‘mysql-connector-j-8.0.33.tar.gz’ saved [24736432/24736432]

# 解压并复制驱动到Tomcat lib目录
tar -zxvf mysql-connector-j-8.0.33.tar.gz
mysql-connector-j-8.0.33/
mysql-connector-j-8.0.33/LICENSE
mysql-connector-j-8.0.33/README.txt
mysql-connector-j-8.0.33/mysql-connector-j-8.0.33.jar
mysql-connector-j-8.0.33/docs/

cp mysql-connector-j-8.0.33/mysql-connector-j-8.0.33.jar /Tomcat/app/lib/

# 重启Tomcat服务
/Tomcat/app/bin/shutdown.sh && /Tomcat/app/bin/startup.sh
Using CATALINA_BASE: /Tomcat/app
Using CATALINA_HOME: /Tomcat/app
Using CATALINA_TMPDIR: /Tomcat/app/temp
Using JRE_HOME: /usr/lib/jvm/java-17-openjdk
Using CLASSPATH: /Tomcat/app/bin/bootstrap.jar:/Tomcat/app/bin/tomcat-juli.jar
Using CATALINA_OPTS:
Tomcat started.

4.2 邮件会话配置实战

# 下载JavaMail库
wget https://repo1.maven.org/maven2/com/sun/mail/jakarta.mail/2.0.1/jakarta.mail-2.0.1.jar
–2026-04-10 12:10:00– https://repo1.maven.org/maven2/com/sun/mail/jakarta.mail/2.0.1/jakarta.mail-2.0.1.jar
Resolving repo1.maven.org (repo1.maven.org)… 151.101.244.209
Connecting to repo1.maven.org (repo1.maven.org)|151.101.244.209|:443… connected.
HTTP request sent, awaiting response… 200 OK
Length: 699349 (683K) [application/java-archive]
Saving to: ‘jakarta.mail-2.0.1.jar’

jakarta.mail-2.0.1.jar 100%[====================================>] 683.06K 1.2MB/s in 0.6s

2026-04-10 12:10:01 (1.2 MB/s) – ‘jakarta.mail-2.0.1.jar’ saved [699349/699349]

# 复制JavaMail库到Tomcat lib目录
cp jakarta.mail-2.0.1.jar /Tomcat/app/lib/

# 重启Tomcat服务
/Tomcat/app/bin/shutdown.sh && /Tomcat/app/bin/startup.sh
Using CATALINA_BASE: /Tomcat/app
Using CATALINA_HOME: /Tomcat/app
Using CATALINA_TMPDIR: /Tomcat/app/temp
Using JRE_HOME: /usr/lib/jvm/java-17-openjdk
Using CLASSPATH: /Tomcat/app/bin/bootstrap.jar:/Tomcat/app/bin/tomcat-juli.jar
Using CATALINA_OPTS:
Tomcat started.

4.3 自定义资源配置实战

# 创建自定义资源类
vi /Tomcat/app/webapps/fgedu-webapp/WEB-INF/classes/com/fgedu/resources/CustomResource.java
package com.fgedu.resources;

public class CustomResource {
private String name;
private int value;

public CustomResource(String name, int value) {
this.name = name;
this.value = value;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getValue() {
return value;
}

public void setValue(int value) {
this.value = value;
}

@Override
public String toString() {
return “CustomResource{” +
“name='” + name + ‘\” +
“, value=” + value +
‘}’;
}
}

# 创建资源工厂类
vi /Tomcat/app/webapps/fgedu-webapp/WEB-INF/classes/com/fgedu/resources/CustomResourceFactory.java
package com.fgedu.resources;

import org.apache.naming.factory.BeanFactory;

import javax.naming.Context;
import javax.naming.Name;
import javax.naming.RefAddr;
import javax.naming.Reference;
import javax.naming.spi.ObjectFactory;
import java.util.Hashtable;

public class CustomResourceFactory implements ObjectFactory {

@Override
public Object getObjectInstance(Object obj, Name name, Context nameCtx, Hashtable environment) throws Exception {
if (obj instanceof Reference) {
Reference ref = (Reference) obj;
String className = ref.getClassName();
if (className.equals(CustomResource.class.getName())) {
String nameParam = null;
int valueParam = 0;

RefAddr nameAddr = ref.get(“name”);
if (nameAddr != null) {
nameParam = (String) nameAddr.getContent();
}

RefAddr valueAddr = ref.get(“value”);
if (valueAddr != null) {
valueParam = Integer.parseInt((String) valueAddr.getContent());
}

return new CustomResource(nameParam, valueParam);
}
}
return null;
}
}

# 编辑context.xml文件,配置自定义资源
vi /Tomcat/app/webapps/fgedu-webapp/META-INF/context.xml





type=”com.fgedu.resources.CustomResource”
factory=”com.fgedu.resources.CustomResourceFactory”
name=”fgeduResource”
value=”100″ />

# 重启Tomcat服务
/Tomcat/app/bin/shutdown.sh && /Tomcat/app/bin/startup.sh
Using CATALINA_BASE: /Tomcat/app
Using CATALINA_HOME: /Tomcat/app
Using CATALINA_TMPDIR: /Tomcat/app/temp
Using JRE_HOME: /usr/lib/jvm/java-17-openjdk
Using CLASSPATH: /Tomcat/app/bin/bootstrap.jar:/Tomcat/app/bin/tomcat-juli.jar
Using CATALINA_OPTS:
Tomcat started.

4.4 JNDI资源使用实战

# 创建Servlet使用JNDI资源
vi /Tomcat/app/webapps/fgedu-webapp/WEB-INF/classes/com/fgedu/servlet/JNDIResourceServlet.java
package com.fgedu.servlet;

import com.fgedu.resources.CustomResource;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;

@WebServlet(“/jndi”)
public class JNDIResourceServlet extends HttpServlet {

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType(“text/html”);
PrintWriter out = response.getWriter();
out.println(““);
out.println(“

JNDI资源使用示例

“);

try {
// 初始化JNDI上下文
Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup(“java:comp/env”);

// 获取数据源
out.println(“

1. 数据源使用

“);
DataSource ds = (DataSource) envCtx.lookup(“jdbc/fgedudb”);
Connection conn = ds.getConnection();
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(“SELECT 1 as test”);
if (rs.next()) {
out.println(“

数据库连接成功: ” + rs.getInt(“test”) + “

“);
}
rs.close();
stmt.close();
conn.close();

// 获取环境变量
out.println(“

2. 环境变量使用

“);
String appVersion = (String) envCtx.lookup(“app.version”);
String appEnvironment = (String) envCtx.lookup(“app.environment”);
out.println(“

应用版本: ” + appVersion + “

“);
out.println(“

应用环境: ” + appEnvironment + “

“);

// 获取自定义资源
out.println(“

3. 自定义资源使用

“);
CustomResource customResource = (CustomResource) envCtx.lookup(“resource/custom”);
out.println(“

自定义资源: ” + customResource.toString() + “

“);

} catch (Exception e) {
out.println(“

错误: ” + e.getMessage() + “

“);
e.printStackTrace();
}

out.println(“”);
}
}

# 访问JNDI资源示例
curl http://localhost:8080/fgedu-webapp/jndi

JNDI资源使用示例


1. 数据源使用


数据库连接成功: 1


2. 环境变量使用


应用版本: 1.0.0


应用环境: production


3. 自定义资源使用


自定义资源: CustomResource{name=’fgeduResource’, value=100}


4.5 常见问题与解决方案

  • 数据源连接失败:检查数据库连接配置,确保数据库服务正常运行
  • JNDI查找失败:检查资源名称是否正确,确保资源已正确配置
  • 类加载问题:检查资源类是否在类路径中,确保类名正确
  • 权限错误:检查Tomcat用户权限,确保有足够的权限访问资源
  • 资源泄漏:确保在使用完资源后正确关闭连接

学习交流加群风哥QQ113257174

Part05-风哥经验总结与分享

5.1 最佳实践

  • 使用全局资源配置共享资源
  • 配置适当的连接池参数
  • 使用环境变量存储敏感信息
  • 定期监控资源使用情况
  • 备份资源配置

5.2 性能优化

性能优化建议:

  • 配置适当的连接池大小
  • 设置合理的连接超时时间
  • 启用连接池监控
  • 优化资源初始化参数
  • 使用连接池验证机制

5.3 自动化管理

自动化管理脚本示例:

# 自动化管理脚本
vi jndi.sh
#!/bin/bash
# jndi.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`

# 配置参数
TOMCAT_HOME=”/Tomcat/app”

# 备份JNDI配置
backup_jndi() {
local backup_dir=”$TOMCAT_HOME/conf/backup”
mkdir -p “$backup_dir”
cp “$TOMCAT_HOME/conf/server.xml” “$backup_dir/server.xml.$(date +%Y%m%d%H%M%S)”
echo “JNDI配置备份成功”
}

# 重启Tomcat服务
restart_tomcat() {
$TOMCAT_HOME/bin/shutdown.sh
sleep 5
$TOMCAT_HOME/bin/startup.sh
echo “Tomcat服务重启成功”
}

# 主函数
case “$1” in
backup)
backup_jndi
;;
restart)
restart_tomcat
;;
*)
echo “Usage: $0 {backup|restart}”
;;
esac

5.4 故障排查

  • 查看Tomcat日志文件
  • 检查资源配置
  • 验证资源连接
  • 测试JNDI查找
  • 检查类路径
  • 验证数据库连接

风哥提示:在生产环境中,建议使用全局JNDI资源配置共享资源,提高资源利用率和管理效率。同时,要定期监控资源使用情况,确保资源的正常运行。

总结

本文详细介绍了Tomcat JNDI资源的配置与自定义资源实战,包括数据源、邮件会话和自定义资源的配置和使用。通过本文的学习,您应该掌握了Tomcat JNDI资源的配置和使用技巧。

Tomcat JNDI资源是Tomcat提供的一个强大功能,可以帮助您集中管理应用所需的各种资源。在实际应用中,建议根据业务需求配置适当的JNDI资源,并定期监控资源使用情况。

更多学习教程公众号风哥教程itpux_com

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息