Tomcat JNDI 连接池部署三步从零拿到数据库连接【免费下载链接】tomcatApache Tomcat项目地址: https://gitcode.com/gh_mirrors/tom/tomcat如果你接手 Tomcat 应用需要连数据库这篇文章帮你完成 Tomcat JNDI 连接池部署只在服务器端配置一次数据源应用通过 JNDI 名称从连接池取连接。不用在代码里硬编码账号密码也不用每个请求都新建连接。 连接池解决哪三个真实问题线上跑 Tomcat 应用数据库相关痛点基本逃不出这三类常见现象背后的代价每个请求新建一条 Connection每次握手、认证都耗时并发一上来吞吐骤降用户名密码硬编码在 Java 代码里换密码要改代码、重新发布并发下报等待连接超时连接被耗尽用户直接看到 500解决思路一致把数据源定义交给容器配置应用只用 JNDI 名称java:comp/env/jdbc/TestDB查找。池的容量、生命周期、监控全部由 Tomcat 统一管理。 准备环境把两个 jar 放对位置认清目录结构Tomcat 安装后只需熟悉两个目录lib/是服务器级类路径放进去的 jar 对所有应用可见webapps/放应用。本地还没有 Tomcat 的话先克隆源码并按 BUILDING.txt 构建git clone https://gitcode.com/gh_mirrors/tom/tomcat。放置连接池实现与数据库驱动需要放进lib/的是两个东西tomcat-jdbc 连接池本仓库 modules/jdbc-pool/ 下就是它的源码直接用发行版打好的 jar 即可和数据库驱动 jar如 MySQL Connector/J。注意 lib 下的 jar 在启动时加载放完必须重启 Tomcat 才生效。⚙️ 在 context.xml 里声明 数据源该改哪个文件全局默认配置在conf/context.xml对每个应用生效也可以给单个应用建独立 context 文件放在conf/Catalina/localhost/下。二选一两处重名时以单应用文件为准混用容易互相覆盖。写入数据源声明下面是最小可用的一段声明放在Context节点内重启后生效Context Resource namejdbc/TestDB authContainer typejavax.sql.DataSource driverClassNamecom.mysql.cj.jdbc.Driver urljdbc:mysql://localhost:3306/javatest usernamejavauser passwordjavadude maxTotal50 maxIdle10 maxWaitMillis10000/ /Context池参数最常调的是这三个参数作用maxTotal池中连接数上限不要超过数据库 max_connectionsmaxIdle保留的空闲连接上限maxWaitMillis拿不到连接时的最长等待毫秒数超时抛异常Oracle、PostgreSQL 等其他数据库的差异写法可查仓库内 webapps/docs/jndi-datasource-examples-howto.xml。✅ 跑一个 JSP 页面验证连接池通了在 web.xml 声明资源引用应用侧必须声明资源引用这一步漏掉后面的 JNDI 查找必定失败resource-ref res-ref-namejdbc/TestDB/res-ref-name res-typejavax.sql.DataSource/res-type res-authContainer/res-auth /resource-ref写验证页并访问把下面的页面放进应用根目录重启 Tomcat浏览器访问该 JSP% page importjava.sql.*, javax.naming.*, javax.sql.* % % Context env new InitialContext().getContext(java:comp/env); DataSource ds (DataSource) env.lookup(jdbc/TestDB); try (Connection con ds.getConnection(); Statement st con.createStatement(); ResultSet rs st.executeQuery(select 1)) { out.println(rs.next() ? Pool OK : No result); } %跑通后的样子页面输出Pool OKcatalina.out 日志里能看到应用 context 正常启动。此时这条连接来自池借出和归还都由容器完成应用代码不再关心连接的创建成本。️ 三个常见报错与修复NameNotFoundException先查两处名字是否一致症状lookup 抛 NameNotFoundException提示找不到 jdbc/TestDB。 原因web.xml 里 res-ref-name 与 context.xml 里 Resource 的 name 不一致或者根本没写 resource-ref。 修复分别打开两个文件核对名字是否逐字符一致缺声明的补上再重启。Communications link failurejar 与类名要配齐症状获取连接失败日志出现 Communications link failure 或 No suitable driver。 原因驱动 jar 没放进 lib/或 driverClassName 写错——旧版驱动是 com.mysql.jdbc.Driver现行 Connector/J 应为 com.mysql.cj.jdbc.Driver。 修复确认驱动 jar 已复制到 lib/ 并重启把类名改对。等待连接超时多半是泄漏不是池小症状系统平时正常跑一段时间后突然报 timeout waiting for connection。 原因某条代码路径没关闭 Connection 或 ResultSet池子被慢慢耗尽。 修复排查代码确认用 try-with-resources必要时在 Resource 上加removeAbandonedOnBorrowtrue让容器强制回收泄漏连接并打印堆栈定位是哪段代码没还连接。 接下来可以做什么监控池状态tomcat-jdbc 把池暴露为 MBean通过 JMX 工具可实时看空闲与在用连接数。拦截慢查询modules/jdbc-pool/ 内置 SlowQueryReport 拦截器可记录慢 SQL 输出到日志。多应用共享多个应用连同一个库时把资源挪到conf/server.xml的GlobalNamingResources下定义成全局资源避免多个池重复占连接。验证页输出 Pool OK 之后把select 1换成你的真实查询这套 Tomcat JNDI 连接池就算完整落地了。【免费下载链接】tomcatApache Tomcat项目地址: https://gitcode.com/gh_mirrors/tom/tomcat创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考