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包,但实际没加到项目的构建路径里,等于没生效:
- 在你的Eclipse项目里新建一个
lib文件夹(如果没有的话) - 把
mysql-connector-java-8.0.11.jar复制到这个lib文件夹里 - 右键这个jar包 → 选择「Build Path」→「Add to Build Path」
- 确认「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
相关产品推荐
相关产品推荐

