sybn sybn-util 项目说明文档 - 基于java的跨数据库联合查询

DatasSqlDdlEngine

2018-09-13
sybn

简介

DatasSqlDdlEngine 是针对 List 执行 sql 语句的工具。

用于处理那些非数据库数据,比如 xls 中的数据。

该系列有3个实现类:

  • DatasSqlDdlEngine 处理 list
  • DatasSqlDdlStreamEngine 处理 stream
  • DatasSqlDdlStreamAsyncEngine 异步处理 stream, 原样返回新的流, 通过 callback 输出结果

优缺点

  • DatasSqlDdlEngine 处理 list, 当处理GB级别的源数据时, JVM 会因为内存不足而 OOM. 因此只适用于处理小数据量的业务(比如小于500M的sql表).
  • DatasSqlDdlStreamEngine 处理 stream 无论源数据有多大, 都不会因为源数据而 OOM, 内存占用最低. 但是如果范围的结果集数据过大, 仍然会OOM.
  • DatasSqlDdlStreamAsyncEngine 可以对一个流执行互不相关的一批sql语句, 可以大幅节约外部IO, 但是会同时在内存中保存所有sql的返回值, 有一定的OOM风险.

用法举例

String sqlFind = "select * from sybn_junit_base where id between '2018-03-20' and '2018-03-21'";
String sqlCount = "select count(*) from sybn_junit_base where id between '2018-03-20' and '2018-03-21'";

// DatasSqlDdlEngine 处理 list 支持是Map或JavaBean,返回值同样可以是Map或JavaBean
List<Map<String, Object>> result1 = DatasSqlDdlEngine.sqlFindListMap(list, sqlFind);
List<SybnJunitBase> result2 = DatasSqlDdlEngine.sqlFindList(list, sqlFind, SybnJunitBase.class);

// DatasSqlDdlStreamEngine 处理 stream 注意:执行后 stream 会被消费无法继续使用
List<Map<String, Object>> result3 = DatasSqlDdlStreamEngine.sqlFindListMap(stream1, sqlFind);
List<SybnJunitBase> result4 = DatasSqlDdlStreamEngine.sqlFindList(stream2, sqlFind, SybnJunitBase.class);

// DatasSqlDdlStreamAsyncEngine 原样返回新的 stream. 因此可以对一个流并行执行多条 sql 语句.
ListCallback callback1 = new ListCallback();
ListCallback callback2 = new ListCallback();
stream4 = DatasSqlDdlStreamAsyncEngine.sqlFindListMap(stream3, sqlFind, callback);
stream5 = DatasSqlDdlStreamAsyncEngine.sqlFindListMap(stream4, sqlCount, callback);
stream5.count();
// 必须等流被 消费后才能使用get获取返回值
List<Map<String, Object>> result5 = callback1.get();
List<Map<String, Object>> result9 = callback2.get();

支持功能

已经支持如下关键字: select, from, where, group by, having, order by, skip, limit.

已经支持如下函数: avg, sum, count, count(distinct x), max, min, list, set 等

支持如下占位符: xxx = ?, xxx in (?), xxx > #{xxx}

注意事项

  • DatasSqlDdlEngine 返回的数据是原始数据的深度拷贝,修改返回值不影响原始数据。

  • 深度拷贝会消耗一些额外的性能,改用 DatasSelectUtil 并设置 cloneAble 参数,可以允许跳过深度复制从而提高性能。

  • DatasSqlDdlStreamAsyncEngine 只支持查询 Stream<map> 出于性能考虑不支持java bean. 可以用 BeanMapUtil.toMap() 将 java bean 流转为 Map 流.

相关页面


Similar Posts

上一篇 excel 工具

Comments

暂不开放评论! 可微信联系