Java后端接入GaussDB,连接池与事务的几个注意点
【摘要】 Java 服务接GaussDB的时候容易出问题的不是 SQL 本身,而是连接池配置和事务边界。聊聊 HikariCP 怎么配、事务没提交/没回滚的典型翻车现场,以及慢查询的排查思路。
一、别再裸连,用连接池
每次请求都新建连接,建立 TCP + 握手开销巨大,并发稍高连接数就爆。生产环境用连接池,Java 圈基本是 HikariCP:
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:mysql://gaussdb-host:3306/demo");
config.setUsername("appuser");
config.setPassword(System.getenv("DB_PWD")); // 密码走环境变量
config.setMaximumPoolSize(20); // 按业务并发调
config.setConnectionTimeout(3000); // 拿不到连接别死等
HikariDataSource ds = new HikariDataSource(config);
maximumPoolSize 不是越大越好,得结合 GaussDB 实例的最大连接数和业务 QPS 来定,盲目调大反而把数据库拖垮。
二、事务边界:要么全成,要么全滚
最经典的坑:方法里更新了 A 表、B 表,中间抛异常,结果 A 提交了 B 没动,数据对不上。根因是事务没包住整段逻辑。用 Spring 的话:
@Transactional
public void transfer(Long from, Long to, BigDecimal amount) {
accountMapper.deduct(from, amount);
accountMapper.add(to, amount); // 这里抛异常,上面那笔自动回滚
}
几个容易踩的点:
| 现象 | 原因 | 对策 |
|---|---|---|
| 事务不生效 | 方法是 private 或被同类内部调用 |
走代理调用、改 public |
| 异常没回滚 | 只回滚 RuntimeException,检查型异常默认不滚 |
加 @Transactional(rollbackFor = Exception.class) |
| 连接泄露 | 拿连接没关 | 用 try-with-resources 或框架托管 |
三、连接泄露比慢查询更隐蔽
连接用完不归还,池子慢慢被占满,表象是"接口偶尔超时"。养成习惯:用 try-with-resources 自动关连接/语句,别依赖人工 close()。
小结
接 GaussDB 这类云数据库,SQL 写对只是第一步。连接池配合理、事务边界清晰、连接不泄露,这三件事做到位,服务基本就能稳稳跑。剩下的性能问题,再去靠索引和慢查询日志慢慢抠,那又是另一个 topic 了。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)