如何解决JDBC连接Docker中MySQL的通信链路失败问题
解决Docker中MySQL的JDBC连接SSL握手失败问题
问题核心分析
从异常堆栈可知,根源是javax.net.ssl.SSLHandshakeException——JDBC驱动尝试通过SSL连接MySQL,但Docker部署的MySQL默认未启用SSL,导致握手终止;同时代码中还存在SQL执行方法误用的问题。
具体解决步骤
修正JDBC连接URL的SSL参数
将原连接URL修改为:"jdbc:mysql://localhost/sampledb?useSSL=false&allowPublicKeyRetrieval=true"原因:MySQL 8.0+版本的JDBC驱动默认强制SSL连接,而Docker容器内的MySQL默认未配置SSL证书,添加
useSSL=false可禁用SSL连接;allowPublicKeyRetrieval=true用于解决因公钥获取失败导致的连接问题。修正SQL执行方法
代码中使用executeQuery()执行INSERT语句是错误的,该方法仅适用于查询类SQL(返回ResultSet),INSERT/UPDATE/DELETE需使用executeUpdate():// 替换原ResultSet相关代码 int affectedRows = statement.executeUpdate("insert into demo values(1, 'A')"); // 可通过affectedRows判断插入操作是否成功验证MySQL用户权限
进入Docker容器内的MySQL,确认root用户允许从宿主机连接(若密码为空需确保权限配置正确):# 进入Docker MySQL容器 docker exec -it [容器ID/名称] mysql -uroot -p # 执行权限赋予命令(若用户host限制为localhost则需调整) GRANT ALL ON sampledb.* TO 'root'@'%'; FLUSH PRIVILEGES;
内容的提问来源于stack exchange,提问作者Steve Rogers
相关产品推荐
相关产品推荐

