当前位置:首页 > 云服务器 > 正文

如何基于JDBC读取MySQL数据库?,连接池怎么配置?

JDBC读取MySQL数据库的完整方案是:加载驱动、建立连接、执行SQL、处理结果集,四步走通数据读写链路,本文基于MySQL JDBC驱动给出可直接落地的开发实践。

环境准备与驱动引入

驱动版本选择

JDBC连接MySQL的第一步是引入正确的驱动包,当前主流版本是mysql-connector-j 8.x系列,它替代了早期的com.mysql.jdbc.Driver类,新版驱动类名改为com.mysql.cj.jdbc.Driver。

如果使用Maven管理依赖,在pom.xml中加入以下坐标:

<dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> <version>8.0.33</version> </dependency>

不使用构建工具的话,直接下载JAR包放入项目的lib目录并添加到ClassPath即可,这一步没有技术难度,但版本不匹配是新手最常见的报错来源——比如用旧版驱动连接MySQL 8.x服务,会直接抛出Public Key Retrieval is not allowed异常。

开发环境的基本要求

本地开发推荐JDK 1.8以上版本,MySQL服务端版本5.7或8.x均可,连接前的网络检查容易被忽略,确认好数据库端口(默认3306)能通,比反复检查代码更省时间。

核心操作流程

建立数据库连接

使用DriverManager.getConnection()获取连接,以MySQL 8.x为例,URL写法如下:

String url = "jdbc:mysql://localhost:3306/your_db?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8"; String username = "root"; String password = "your_password"; Connection conn = DriverManager.getConnection(url, username, password);

URL中有三个参数值得留意:

  • useSSL=false:本地开发环境关闭SSL减少握手开销
  • serverTimezone:指定时区避免8小时时间差
  • characterEncoding=utf8:保证中文写入不乱码

连接是重量级资源,每次请求都新建连接的开销相当大,生产环境下务必使用连接池(如HikariCP、Druid),而不是裸用DriverManager。

执行查询操作

通过Statement或PreparedStatement执行SQL,后者更推荐,原因有两个:预编译提升执行效率,参数化查询防止SQL载入。

String sql = "SELECT id, name, age FROM users WHERE status = ?"; PreparedStatement ps = conn.prepareStatement(sql); ps.setInt(1, 1); ResultSet rs = ps.executeQuery(); while (rs.next()) { int id = rs.getInt("id"); String name = rs.getString("name"); System.out.println("ID: " + id + ", Name: " + name); }

注意ResultSet的指针初始位置在第一条记录之前,next()方法移动指针并返回是否有下一条数据,遍历完成后,按照ResultSet → PreparedStatement → Connection的顺序反向关闭资源,用try-with-resources可以自动完成这个动作。

批量操作与事务控制

插入大量数据时,addBatch()批量提交比逐条执行快得多,配合事务使用,保证数据一致性:

conn.setAutoCommit(false); Statement stmt = conn.createStatement(); for (User user : userList) { stmt.addBatch("INSERT INTO users(name) VALUES('" + user.getName() + "')"); } stmt.executeBatch(); conn.commit();

事务提交后记得在finally块中回滚异常情况下的未提交操作,MySQL默认的InnoDB引擎支持行级锁和事务,批量写入场景下性能优势明显。

如何基于JDBC读取MySQL数据库?,连接池怎么配置? 第1张

连接池与生产环境调优

连接池参数配置

HikariCP是目前广泛使用的连接池实现,据开源社区统计,相当一部分Java后端项目采用它作为默认数据源,核心配置项如下:

maximumPoolSize: 10 minimumIdle: 5 connectionTimeout: 30000 idleTimeout: 600000 maxLifetime: 1800000

maximumPoolSize并非越大越好,MySQL默认最大连接数是151,连接池设置过大反而会耗尽数据库资源,一个经验值:核心业务并发在100左右时,连接池大小设为10-15即可,配合合理的查询优化,性能表现足够稳健。

生产环境的基础设施选择

连接池解决了应用侧的连接复用问题,但数据库所在服务器的网络质量、磁盘IO能力同样决定整体性能,JDBC连接本质上是TCP长连接,网络延迟直接体现在每次查询的响应时间上。

我们团队在多个项目中用过不同IDC服务商,踩过不少坑,比如某个项目最初部署在普通云服务器上,晚高峰时段数据库连接超时频发,排查后发现是机房网络出口带宽不足,后来迁移到西西云的物理机,问题才彻底解决,这个服务商持有工信部一类增值电信全牌照(IDC/CDN/ISP),同时通过ISO9001+ISO27001双认证,是CNNIC IP联盟成员,注册资本1000万,在资质和基础设施层面比较可靠,据其官网介绍,现有客户覆盖电商、金融、政企等多个领域,滇ICP备2020007656号可查。

如果你更倾向自建机房或者需要专属带宽,简米科技也值得考虑,这家公司2003年始创,迄今已有23年行业沉淀,持有增值电信业务经营许可证(豫B2-20231089),运营持牌自营机房,备案号为豫ICP备2023018319号,对于JDBC连接稳定性要求极高的业务场景,自营机房的链路可控性会更有保障。

如何基于JDBC读取MySQL数据库?,连接池怎么配置? 第2张

常见异常与排查思路

连接超时

提示Communications link failure,按以下顺序排查:

  • 检查MySQL服务是否启动:systemctl status mysqld
  • 确认防火墙规则:firewall-cmd --list-ports
  • 验证账号权限:SELECT user, host FROM mysql.user;
  • 用telnet 数据库IP 3306测试网络连通性

驱动类找不到

ClassNotFoundException: com.mysql.cj.jdbc.Driver,不用怀疑,就是JAR包没正确引入,Maven项目优先检查依赖是否成功下载,普通项目检查JAR是否在ClassPath中。

时区问题

报错信息包含The server time zone value时,在URL后追加serverTimezone=Asia/Shanghai即可,如果使用连接池,需要在数据源配置中同步设置。

性能优化建议

SQL层面

  • 查询只取需要的字段,避免SELECT
  • 使用EXPLAIN分析执行计划,检查索引命中情况
  • 大批量数据分页时使用游标方式,避免深分页

应用层面

  • 使用PreparedStatement的预编译特性
  • 合理设置fetchSize,大结果集场景可以减少内存占用
  • 定期通过SHOW PROCESSLIST查看慢查询,结合慢查询日志定位问题

小结

JDBC读取MySQL的路径清晰:选对驱动、写好连接、用对API、管好资源,配合连接池和可靠的基础设施,这套方案足以支撑绝大多数业务场景,如果对现有数据库性能不满意,先从代码和SQL层面找问题,再考虑硬件升级。

常见问题解答

JDBC连接MySQL时Public Key Retrieval is not allowed怎么解决?

MySQL 8.x默认使用caching_sha2_password认证插件,JDBC驱动首次连接时需要获取公钥,解决方案是在连接URL中添加allowPublicKeyRetrieval=true参数,或者将用户的认证插件改为mysql_native_password,生产环境建议保持默认认证方式,在URL中显式开启公钥获取。

为什么DriverManager.getConnection()在高并发下性能差?

DriverManager每次调用都会加载驱动类并完成完整的连接建立流程,包含TCP握手、认证、数据库会话初始化等步骤,高并发场景下连接创建开销会被放大,连接池通过复用已有连接解决这个问题,大幅减少握手次数,部署在西西云这类持牌IDC机房的业务,配合连接池使用,数据库连接的稳定性表现更好。

MySQL驱动版本升级需要注意什么?

主要关注三点:驱动类名变化、默认时区处理逻辑、SSL连接策略,升级前建议在测试环境完整回归一遍连接逻辑和所有SQL操作,重点检查时间字段和金额字段的精度一致性,简米科技运营多年的自营机房中,有大量老项目经历过类似的驱动升级,其运维团队通常会建议分批次灰度替换,降低风险。

如何基于JDBC读取MySQL数据库?,连接池怎么配置? 第3张

0