公司最近在做数据中台,我负责数据同步这块的处理。

公司现在多个系统,一部分从外部厂商采购,如上海秉坤的 POS 系统;一部分是 IT 部门成立后公司自研开发的;数据分散在多个不同的数据库,有 MSSQL Server2012 ,也有 MySQL5.6 ,还有部分数据在 Orcle 上。
IT 宝哥提供了内部数据同步框架,为了减少内存的压力,数据同步时使用游标一行一行地读取源数据,在整个过程中中共遇到了两个问题,记录一下。

  1. MSSQL Server 不支持设置游标的类型,在关闭 Connection 时,必须等待游标移动到队尾,这个过程可能需要很久,最终通过 stmt.cancel();的方式实现及时中断。
  2. MySQL 下使用默认的 PrepareStatement 通过游标读取数据时,会加载所有数据,不能实现通过游标一行一行,以流的形式读取,最终通过如下的方式实现流式读取。
    1
    2
    conn.prepareStatement(SQL, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY); 
    pstmt.setFetchSize(Integer.MIN_VALUE);

第2个问题参考了这个博客