Tomcat连接池连接Laravel Forge MySQL8时JDBC URL配置报错求助
核心错误原因
你使用的com.mysql.cj.jdbc.Driver是官方MySQL JDBC驱动,它仅支持jdbc:mysql://开头的标准连接URL,不识别jdbc:mysql+ssh://这种带SSH隧道的自定义格式,这就是报错的直接原因。
解决方案(两种可选)
方案一:手动建立SSH隧道(推荐,稳定性更高)
既然你能通过MySQL Workbench连接,大概率Workbench是通过SSH隧道访问远程数据库的。你可以先在本地建立SSH端口转发,再用普通JDBC URL连接:
建立SSH隧道:
在终端执行以下命令(默认远程SSH端口为22,MySQL默认端口为3306;如果你的端口不同,自行修改):ssh -L 3307:127.0.0.1:3306 forge@199.199.199.199这条命令会把本地的3307端口,转发到远程服务器的3306端口(MySQL服务端口)。
修改Tomcat Context配置:
将Resource中的URL替换为标准MySQL格式,同时补充MySQL8必需的参数:<Resource name="jdbc/mysql" auth="Container" type="javax.sql.DataSource" driverClassName="com.mysql.cj.jdbc.Driver" url="jdbc:mysql://127.0.0.1:3307/forge?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true" username="forge" password="veryverysecret" maxTotal="20" <!-- 建议设合理值,避免连接耗尽 --> maxIdle="10" maxWaitMillis="30000"/>注意:
username和password是你的MySQL数据库账号密码,不是SSH登录账号密码(如果两者一致则无需修改)。依赖检查:
确保Tomcat的lib目录下存在官方MySQL JDBC驱动包(版本需≥8.0,比如mysql-connector-java-8.0.30.jar)。
方案二:使用支持SSH的第三方JDBC驱动
如果不想手动维护SSH隧道,可以使用第三方驱动直接实现JDBC+SSH连接:
添加驱动依赖:
如果用Maven管理项目,在pom.xml中添加:<dependency> <groupId>com.github.gwenn</groupId> <artifactId>mysql-ssh-jdbc</artifactId> <version>0.0.7</version> </dependency>也可以直接下载jar包放到Tomcat的
lib目录下。修改Tomcat Context配置:
替换驱动类和正确的SSH格式URL:<Resource name="jdbc/mysql" auth="Container" type="javax.sql.DataSource" driverClassName="com.github.gwenn.mysqlssh.Driver" url="jdbc:mysql+ssh://forge@199.199.199.199:22/127.0.0.1:3306/forge?usePrivateKey=true&privateKeyFile=/path/to/your/private/key" username="forge" password="veryverysecret" maxTotal="20" maxIdle="10" maxWaitMillis="30000"/>注意:
privateKeyFile需要替换为你本地SSH私钥的绝对路径(比如C:/Users/xxx/.ssh/id_rsa或/home/xxx/.ssh/id_rsa)。
额外注意事项
- MySQL8默认使用
caching_sha2_password加密方式,确保JDBC驱动版本≥8.0,且URL中包含allowPublicKeyRetrieval=true参数,否则可能出现连接失败。 maxTotal="-1"会允许创建无限多的数据库连接,容易导致服务器资源耗尽,建议设置为合理数值(如20)。
内容的提问来源于stack exchange,提问作者LostAndConfused

