某些场景下, 需要批量载入数据到其他数据源.
以 es 为例, 相关代码如下:
// 初始化各种数据源, 为了容易理解这里使用直接传入jdbc的实现类
SybnStreamDao dao1 = new DbutilStreamDaoImpl("jdbc:mysql://账户:密码@192.168.4.31:3306,192.168.4.32:3306/test"); // sql
// SybnStreamDao dao2 = new MongoStreamDaoImpl("mongodb://账户:密码@192.168.4.31:27017,192.168.4.32:27017/test"); // mongo
// SybnStreamDao dao3 = new SolrStreamDaoImpl("solr://192.168.7.71:2181,192.168.7.72:2181/solr"); // solr
EsStreamDaoImpl dao4 = new EsStreamDaoImpl("es", "es://192.168.7.71:9200,192.168.7.72:9200"); // es
// SybnStreamDao dao5 = new HBaseStreamDaoImpl("hbase://192.168.7.71,192.168.7.72/hbase-unsecure"); // HBase
// 设置 es 的数据落盘时间, 防止频繁落盘降低性能.
dao4.setEsRefreshInterval("xxx_es", 300);
// 设置每次个批次写入的数据量
dao4.setSaveBatchSize(3000);
// 流式读取数据
Stream<Map<String, Object>> mapStream = dao1.sqlFindStreamMap("select * from xxx where id > 123");
// 流式写入数据
dao4.commonSaveStream("xxx_es", mapStream);
// 恢复设置 es 的数据落盘时间为1秒.
dao4.setEsRefreshInterval("xxx_es", 1);
实测效率再 5000行/秒 左右, 此数据受 单行数据大小, 磁盘io 和 网络速度 等因素影响.
某些场景下, 需要批量执行某些 sql, 其中 sql 中表名或者字段名是变量。
原生sql中, 一般使用存储过程实现。 本工具为了满足此场景, 引入了 execBatch 批量操作。
-- 前置sql, 列出所有表名
show tables;
-- 单线程批量操作, 获取所有表的表结构
execBatch(show create table @tables);
```sql
-- 前置sql, 列出所有表名
show tables;
-- 多线程批量操作, 获取所有表的表结构, 如果单个任务失败不影响其他任务继续执行
execBatch(show create table @tables) ON concurrent=5 and ignore_error=true;
对于复杂的 sql, 我们不清楚其表结构和索引结果. 使用 CommentSql 工具, 可以帮助我们快速阅读 sql 逻辑.
import cn.sybn.util.io.driver.util.CommentSqlUtil;
@Test
public void commentSqlSimpleTest() {
String sql = "-- sql\n" +
"select a \n" +
"from t \n" +
"where b >1 and c = 1 and d is not null;\n" +
"-- 建表语句\n" +
"create table `t` (\n" +
" a int comment '字段a注释',\n" +
" b int comment '字段b注释',\n" +
" c int comment '字段c注释',\n" +
" d int comment '字段c注释',\n" +
" PRIMARY KEY (`a`),\n" +
" UNIQUE KEY `b` (`b`),\n" +
" KEY `b_c` (`b`,`c`)\n" +
")\n";
String s = CommentSqlUtil.commentSql(sql);
}
在 echart 等业务场景下, 查询N天的数据时, 希望返回一天一行, 一共N行数据.
但是从数据库 group by 出来的数据可能不够7行, 需要将没有数据的日期填充进来.
select date, sum(v) as v from [{date:'2021-12-03',v:3},{date:'2021-12-06',v:6}] group by date
| date | v |
|---|---|
| 2021-12-03 | 3 |
| 2021-12-06 | 3 |