宝塔自助建站系统源码,wordpress 删除 加载中,中国十大品牌设计公司,WordPress前端上传大文件文章目录 前言业务现状架构思路技术细节生成摘要IDSXSSFWorkbookMinIomybatis 流查询PipedInputStream 保存到minio 总结 前言
由于业务涉及到数据比较大#xff0c;用户对导出功能使用频繁#xff0c;每次导出数据两10万以上。 为了减少数据库压力#xff0c;及应用服务器… 文章目录 前言业务现状架构思路技术细节生成摘要IDSXSSFWorkbookMinIomybatis 流查询PipedInputStream 保存到minio 总结 前言
由于业务涉及到数据比较大用户对导出功能使用频繁每次导出数据两10万以上。 为了减少数据库压力及应用服务器性能压力。 在此记录一下大数据导出解决方案。 业务现状
数据周期 一天内数据不变即数据一天首次更新后要到第二天才会变动。
架构思路
摘要ID: 如果ID相同说明是相同的导出任务可以重用没必要开启新的导出任务。
技术细节
生成摘要ID
message: URI 关键参数字符串 当天时间
SXSSFWorkbook
针对大数据导出大家都说好。此次省略好多字
MinIo
附件存贮服务。 各有喜好我就用了这个。 相关桶主备功能可以参阅我的另一篇文章Minio桶复制Bucket Replication
mybatis 流查询
主要功能数据以流的方式有结果一条一条的处理。 以前是先查询所有数据再封装到 SXSSFWorkbook 现在改成每来一条就添加一条到SXSSFWorkbook所以SXSSFWorkbook需要做好封装。 关键代码 PipedInputStream 保存到minio
优化前
// 问题
// 1. XSSFWorkbook 不适合大数据导出
// 2. bos.toByteArray() 会造成内存溢出XSSFWorkbook xwb new XSSFWorkbook();.................ByteArrayOutputStream bos new ByteArrayOutputStream();wb.write(bos);byte[] bytes bos.toByteArray();........// 使用 bytes 上传到 minio优化后 使用 PipedInputStream 直接上传到 minio 这里注意 1.
// 一定要有
// 新手包括我自己平时写代码没有关闭连接的习惯很多连接不关闭短时间是没有问题的
// 但是在这里必须有不然PipedInputStream 会一直堵塞minio 上传无法完成。out.close();executor 线程池 PipedInputStream PipedOutputStream 两者不能在同一线程里 大家都这么说。
SXSSFWorkbook wb new SXSSFWorkbook();
.............总结
需要根据自己的业务情况考虑。 改造 SXSSFWorkbook 需要做好封装。 对 PipedInputStream PipedOutputStream 需要有一定了解起初没有正确关闭流导致bug调试很久。