You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Eclipse中用iText生成PDF时MySQL连接失败求助

解决MySQL JDBC连接失败(SQLNonTransientConnectionException)的问题

别慌,刚接触JDBC连接MySQL的时候,这种连接问题真的很常见,咱们一步步来排查解决:

1. 先确认MySQL服务是否正在运行

这是最容易忽略的基础问题:

  • 按下Win+R,输入services.msc打开系统服务列表
  • 找到名称为MySQL(可能带版本后缀,比如MySQL80)的服务
  • 如果状态不是「正在运行」,右键点击「启动」,之后再尝试运行你的代码

2. 修正JDBC连接URL(MySQL 8.0版本必加参数)

你用的是MySQL Connector/J 8.0版本,除了useSSL=false,还必须指定时区参数——这是8.0版本连接失败的高频原因。把你的连接URL改成这样:

Connection con = DriverManager.getConnection(
    "jdbc:mysql://localhost:3306/test?autoReconnect=true&useSSL=false&serverTimezone=Asia/Shanghai", 
    "root", 
    "a1s2d3f4g5"
);

这里serverTimezone=Asia/Shanghai是设置为中国时区,也可以用UTC,根据你的系统时区调整即可。

3. 验证账号密码与数据库权限

先排除账号本身的问题:

  • 打开MySQL Workbench,用同样的root账号和密码a1s2d3f4g5连接localhost的test数据库,确认能正常登录并看到codes表
  • 如果Workbench都连不上,那就是账号密码错误或数据库不存在的问题,先解决这个再回到代码

4. 确保MySQL驱动包正确导入Eclipse

有时候看起来导入了jar包,但实际没加到项目的构建路径里,等于没生效:

  1. 在你的Eclipse项目里新建一个lib文件夹(如果没有的话)
  2. 把mysql-connector-java-8.0.11.jar复制到这个lib文件夹里
  3. 右键这个jar包 → 选择「Build Path」→「Add to Build Path」
  4. 确认「Referenced Libraries」里的jar包没有红色叉号,这样才是真正成功导入的状态

5. 检查端口是否被占用

MySQL默认端口是3306,如果被其他程序占用也会导致连接失败:

  • 打开命令提示符,输入netstat -ano | findstr :3306
  • 如果输出里有其他进程ID,说明端口被占用,可以:
    • 关掉占用端口的程序,或者
    • 修改MySQL的配置文件(my.ini或my.cnf)里的port参数,然后重启MySQL服务

修改后的完整示例代码

把时区参数加上后的代码应该是这样:

import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.PdfWriter;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.sql.*;

public class GeneratePDF {
    public static void main(String[] args) {
        try {
            String file_name = "E:\\Programas\\mypdf.pdf";
            Document document = new Document();
            PdfWriter.getInstance(document, new FileOutputStream(file_name));
            document.open();

            // 加载新版驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
            // 添加时区参数的连接URL
            Connection con = DriverManager.getConnection(
                "jdbc:mysql://localhost:3306/test?autoReconnect=true&useSSL=false&serverTimezone=Asia/Shanghai", 
                "root", 
                "a1s2d3f4g5"
            );
            System.out.println("Connection called");

            Statement stmt = con.createStatement();
            ResultSet rs = stmt.executeQuery("select * from codes");
            while (rs.next()) {
                Paragraph para = new Paragraph(rs.getString("sl_no") + " " + rs.getString("name"));
                document.add(para);
                document.add(new Paragraph(" "));
            }

            con.close();
            document.close();
            System.out.println("PDF生成成功!");
        } catch (DocumentException | FileNotFoundException | SQLException | ClassNotFoundException e) {
            e.printStackTrace(); // 打印完整栈轨迹,能看到更详细的错误细节
        }
    }
}

另外建议把catch块里的System.out.println("Wrong: " + e);改成e.printStackTrace();,这样能看到更完整的错误堆栈信息,方便快速定位问题。

一步步试下来,应该就能解决连接问题了!

内容的提问来源于stack exchange,提问作者user9785670

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:32:46