Tomcat8部署Hibernate5应用失败:SessionFactory创建异常求助
嘿,我之前碰到过几乎一模一样的情况,咱们先从日志里的核心问题入手——你看到的ServletException其实是连锁反应,真正的根因是这条:
Initial SessionFactory creation failed.org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]
结合你的场景(本地/其他服务器正常,仅这台Tomcat+MySQL组合出问题),大概率是这台特定环境的配置或网络问题,给你几个具体的排查方向:
1. 先确认两台虚拟机的网络连通性
这是最常见的原因,因为本地和其他服务器能正常连接,说明你的代码配置没问题,但这台Tomcat可能连不上MySQL服务器:
- 登录Tomcat所在的虚拟机,执行以下命令测试:
# 测试能否ping通MySQL服务器IP ping <你的MySQL服务器IP> # 测试能否访问MySQL的3306端口 telnet <你的MySQL服务器IP> 3306
如果telnet失败,说明MySQL服务器的防火墙/安全组没开放3306端口给Tomcat虚拟机的IP,或者两台机器不在同一内网,需要调整网络规则。
2. 检查MySQL用户的访问权限
MySQL的权限是绑定IP的,可能你给数据库用户授权的是其他服务器的IP,没包含这台Tomcat的IP:
- 登录MySQL服务器,执行SQL查询:
SELECT host, user FROM mysql.user;
看看是否存在你的数据库用户,且host字段是Tomcat虚拟机的IP,或者用%允许所有IP访问(生产环境不建议,但可以临时测试)。如果没有,执行授权命令:
GRANT ALL ON 你的数据库名.* TO '你的用户名'@'Tomcat虚拟机IP' IDENTIFIED BY '你的密码'; FLUSH PRIVILEGES;
3. 验证MySQL驱动与版本兼容性
日志里显示用的是com.mysql.jdbc.Driver,如果你的MySQL服务器是8.0及以上版本,这个驱动类已经过时了,需要换成com.mysql.cj.jdbc.Driver,同时连接URL要添加时区参数:
- 正确的URL格式(MySQL8.0+):
jdbc:mysql://<MySQL服务器IP>:3306/你的数据库名?serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=true
另外要确保项目里的mysql-connector-java版本和MySQL服务器版本匹配:MySQL5.x用5.x驱动,MySQL8.x用8.x驱动。
4. 查看完整的异常栈信息
你提供的日志里Caused by...被截断了,这部分才是最关键的——它会告诉你具体是连接超时、权限拒绝还是驱动错误。建议你找到完整的异常日志,比如Tomcat的localhost.log或者项目的日志文件,把完整的Caused by部分贴出来,能更快定位问题。
5. 临时替换Hibernate连接池(可选)
日志里提示你用了Hibernate内置的连接池(HHH10001002: Using Hibernate built-in connection pool (not for production use!)),虽然这不是主要原因,但如果以上排查都没问题,可以试试换成Tomcat的JDBC连接池,配置方式更稳定,也适合生产环境。
内容的提问来源于stack exchange,提问作者Carlos Chávez

