怎样用 esProc 实现冷热混合运算

 

冷热数据分库以后再混合查询就比较麻烦。很多数据库都不支持,部分支持的能力也有限,还涉及大量数据复制效率也不高;如果分别读出在 Java 里计算又太复杂。esProc 是个不依赖数据库的计算引擎,支持各种数据源,有丰富的计算类库,还能嵌入 Java 使用,天然适合在应用中做冷热数据库混合计算。

先下载 esProc,推荐标准版:https://www.esproc.com/download-esproc

安装后,配下数据库连接,这里以 MySQL 为例。

先把 MySQL JDBC 驱动包放到 [esProc 安装目录]\common\jdbc 目录下(其他数据库类似)。

..

然后启动 esProc IDE,菜单栏选择 Tool-Connect to Data Source,配置 MySQL 标准 JDBC 连接。

..

确定后,测试一下连接,点击 Connect,发现刚刚配置的 hotdb 数据源变成粉红色证明连接成功。

..

接下来,我们尝试在 esProc 中完成冷热数据混合计算。

业务中将本年和去年可能变化的订单数据归类为热数据,放置到 hotdb 库中,将去年以前不再变化的冷数据放到 colddb 库中。两个库表结构完全一致,数据按照时间(可变性)进行冷热分离。现在查询可能涉及两个库的数据,用 esProc 如何实现呢?

上面配置了 hotdb 连接,采用类似的方式再配置一个 colddb。

..

在 esProc IDE 里写一下混合计算的脚本,实现:查询指定日期范围的订单数据,并按支付方式汇总订单金额。

先给脚本增加两个日期参数(sdate,edate)作为订单日期的筛选条件。

..

脚本:

..

脚本分别根据输入参数从热库(A3)和冷库(A4)查询数据,SQL 先汇总了一下,这样可以避免取全部明细太慢。然后在 A5 里进行了合并再汇总,整个过程很简单。

按 ctrl-F9 执行,可以在 IDE 右边看到某个格子(步骤)的执行结果,这里看到的是 A5 最终计算结果。

考虑到查询的数据可能只在一个库内,可以增加判断条件,以减少对数据库的访问。

..

这里的例子两个都是 MySQL(同构库),如果涉及异构库只需要修改数据库连接和对应的 SQL 即可。

下面把 esProc 集成到 Java 应用中。

从 [esProc 安装目录]\esProc\lib 目录下找到 esProc JDBC 相关的 jar 包:esproc-bin-xxxx.jar、icu4j_60.3.jar。

..

将这两个 jar 包部署到 Java 开发环境的类路径下,同时将 MySQL 的驱动包也放到应用中。

再从目录 [esProc 安装目录]\esProc\config 下找到 esProc 配置文件 raqsoftConfig.xml,同样部署到 Java 开发环境的类路径下。打开可以看到前面配置的两个数据源(如果没有需要自行添加)。

..

编写 Java 代码调用 SPL 脚本 hot_cold_query.splx:

public class HotColdQuery {
    public static void main(String[] args) {
        String driver = "com.esproc.jdbc.InternalDriver";
        String url = "jdbc:esproc:local://";
        try {
            Class.forName(driver);
            Connection conn = DriverManager.getConnection(url);
            PreparedStatement st =conn.prepareCall("call hot_cold_query(?,?)");
            st.setObject(1, "2022-01-01");
            st.setObject(2, "2025-12-31");
            st.execute();
            ResultSet rs = st.getResultSet();
            while(rs.next()) {
                System.out.println(
                        rs.getString("payment_method") + "\t" +
                                rs.getDouble("total_amount"));
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

JDBC 的使用跟数据库完全一致,调用 SPL 脚本也与访问存储过程类似,这里是call hot_cold_query(?,?)并传参。

下面是运行结果:

..

这里只是以一个简单的分组汇总来说明 esProc 在 Java 应用中完成冷热混算的过程,esProc 的计算能力还远不止于此,尤其擅长复杂计算。任何数据源对 esProc 都是等同的,只要能访问到就能混算,同构异构都可以,这就意味着冷数据可以采用任意存储(比如文件系统)通过 esProc 都能实现冷热数据混算。