记一次Spring JDBC内存泄漏引起的线上事故

问题再现

最近在维护一个基于 Spring Boot 的数据同步系统。项目使用 druid 连接池,配置动态数据源连接了 16 个数据库,主要用于跑任务处理跨库数据同步。其中的某个任务,在线上环境一直稳定运行,前几天任务又一次执行时,突然收到任务报错的邮件告警。

阅读更多

MyBatis大批量数据处理

前言

最近项目里需要跨数据库同步大批量数据(百万到千万级别),以前都是用 JDBC 来实现。在 JDBC 里,我们能灵活地使用流查询来批次摄取处理,避免OOM,但 JDBC 这玩意儿写多了,谁都会嫌它既啰嗦又繁琐(但性能真香)。于是这次决定用 Springboot + Mybatis 框架来试试。因为涉及到多个数据源和不同的数据库产品(Oracle、PostgreSQL、MySQL),所以在项目里使用了动态数据源。

关于 Springboot 多数据源方案,我参考过最好的文章为下面的3连载,推荐一看。

至于使用 Mybatis 做大批量数据读取和插入,先前也是阅读了大量的参考资料和文档。总体思想跟 JDBC 是一致的,即:流式查询、批次插入。但在讲 Mybatis 之前,先回顾一下 JDBC 时代是怎么做的吧。

阅读更多

使用 Mybatis 简化 JDBC 操作

mybatis

Java简明笔记(十三)JDBC 中,使用 JDBC 来操作数据库,并把查询到的数据库信息进行 java 对象的映射(ORM),但是 JDBC 除了需要自己写SQL之外,还必须操作Connection, Statment, ResultSet,显得繁琐和枯燥。于是我们对 JDBC 进行封装,以简化数据库操作。mybatis就是这样的一个框架。

以下简介摘自官方文档

MyBatis是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。

阅读更多