Tomcat日志中数据库连接错误的常见原因及解决方法
原因:server.xml、context.xml或web.xml中的数据库连接信息(URL、用户名、密码)填写错误,或JNDI名称不一致。
解决方法:
url格式是否正确(如MySQL应为jdbc:mysql://主机名:端口/数据库名),用户名、密码是否与数据库一致;web.xml中的<res-ref-name>与context.xml/server.xml中的<Resource name>完全一致(如均为jdbc/MyDB)。原因:数据库服务(如MySQL、Oracle)未启动,或Tomcat服务器无法通过网络访问数据库服务器。
解决方法:
systemctl status mysql或service mysql start)启动数据库服务;ping 数据库IP测试网络连通性,若不通,检查网络设置或联系运维人员。原因:Tomcat的lib目录下缺少对应的数据库驱动JAR文件(如MySQL的mysql-connector-java-x.x.x.jar)。
解决方法:
lib目录下;原因:连接池参数(如maxActive、maxWait、maxIdle)设置不合理,导致连接不足或超时报错(如“Cannot get a connection, pool error Timeout waiting for idle object”)。
解决方法:
context.xml或server.xml中的连接池参数:
maxActive:增大最大连接数(如从100调整为200),应对高并发场景;maxWait:增加连接获取超时时间(如从10000ms调整为30000ms),避免因短暂网络延迟导致超报;maxIdle:适当增加最大空闲连接数(如从30调整为60),减少频繁创建连接的开销。原因:数据库用户没有从Tomcat服务器IP地址连接的权限(如MySQL用户仅允许本地连接)。
解决方法:
GRANT语句授予用户远程连接权限(如GRANT ALL PRIVILEGES ON 数据库名.* TO '用户名'@'Tomcat服务器IP' IDENTIFIED BY '密码';);FLUSH PRIVILEGES;)。原因:Tomcat服务器与数据库服务器之间的防火墙阻止了数据库端口(如MySQL默认3306)的通信。
解决方法:
sudo ufw allow from Tomcat服务器IP to any port 3306;sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="Tomcat服务器IP" port protocol="tcp" port="3306" accept';原因:应用程序未正确释放数据库连接(如未调用close()方法),导致连接池中的连接被耗尽(如“Connection pool exhausted”)。
解决方法:
try-with-resources语句自动关闭连接(适用于JDBC 7及以上版本):try (Connection conn = dataSource.getConnection();
PreparedStatement ps = conn.prepareStatement("SELECT * FROM mytable")) {
// 执行数据库操作
} catch (SQLException e) {
e.printStackTrace();
}
try-catch-finally,确保在finally块中手动关闭连接(需处理null值和异常)。/usr/local/tomcat/logs/catalina.out(Linux)或C:\Program Files\Apache Software Foundation\Tomcat\logs\catalina.out(Windows);grep "ERROR" catalina.out(Linux)或findstr "ERROR" catalina.out(Windows)快速查找数据库连接错误;