通过游标读取数据时遇到的两个问题
条评论公司最近在做数据中台,我负责数据同步这块的处理。
公司现在多个系统,一部分从外部厂商采购,如上海秉坤的 POS 系统;一部分是 IT 部门成立后公司自研开发的;数据分散在多个不同的数据库,有 MSSQL Server2012 ,也有 MySQL5.6 ,还有部分数据在 Orcle 上。
IT 宝哥提供了内部数据同步框架,为了减少内存的压力,数据同步时使用游标一行一行地读取源数据,在整个过程中中共遇到了两个问题,记录一下。
- MSSQL Server 不支持设置游标的类型,在关闭 Connection 时,必须等待游标移动到队尾,这个过程可能需要很久,最终通过
stmt.cancel();
的方式实现及时中断。 - MySQL 下使用默认的 PrepareStatement 通过游标读取数据时,会加载所有数据,不能实现通过游标一行一行,以流的形式读取,最终通过如下的方式实现流式读取。
1
2conn.prepareStatement(SQL, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
pstmt.setFetchSize(Integer.MIN_VALUE);
第2个问题参考了这个博客