【SSH框架/国际物流商综平台】-09 POI-SXSSFWorkbook 海量数据导出 细粒度权限控制 出口报运模块 打断设计+跳跃查询 内存监控工具jvisualvm

回顾:

1.细粒度权限的控制
2.POI报表
八个步骤
3.Excel版本之间的区别
4.模板打印的步骤
1.制作模板
2.加载模板文件,得到工作簿
3.获取工作表
4.获取行对象
5.获取单元格对象
6.读取单元格的内容
7.读取单元格的样式
8.保存,关闭流
9.下载

1.海量数据导出 HSSFWorkbook XSSFWorkbook

海量:早期百万,大数据出来后,上亿
Hibernate数据量单表要小于500万;
Mybatis/jdbc单表数据大于500万,oracle不要超过1亿
Excel2003数据量有限制:65536行,256列
HSSFWorkbook对象只能操作excel2003 xls扩展名
XSSFWorkbook可以支持excel2007及以上的版本xlsx扩展名
Excel2007 支持的单 sheet : 1048576 行,16384 列
理论上XSSFWorkbook是可以实现百万级别数据报表。实质运行时,可能会产生问题!
原因是在执行P0I报表时所产生的行对象,单元格对象,样式对象,字体对象,它们
都不会销毁,只有P0I报表完成时这些对象才会销毁,这就导致了堆内存中对象的个
数急剧增加,最后可能导到内存溢出

2.SXSSFWorkbook可以支持百万级别数据的P0I

//Workbook wb = new HSSFWorkbook(); //RBgf^fflTexcel2003
//Workbook wb = new XSSFWorkbook。;//作用于excel2007夏以上版本,虽然可以支持大量数据,但实际测试时会失败
Workbook wb = new SXSSFWorkbook。;//可以解决百万數据POI,怛不支持模板,要求P0I的相关jar•在3.0以上

实现原理:

在初始化SXSSFWorkbook这个对象时,可以指定在内存中所产生后的P0I导出相 关对象的个数(默认为100个),一旦内存中对象的个数达到这个指定值时,就将内 存中的这些对象的内容写入磁盘中(xml文件格式),就可以将这些对象从内存中销 毁掉,以后只要达到这个值时,都会这样处理。在最终excel导出完成时,也会将写入 在xml文件中的内容一起导出。

缺点:

内存与磁盘交互时,需要占用io流相关操作,它本身也是耗时的,如果机 器配置比较低时,就会出现磁盘写操作还没有完成,但是内存中又存在了指定数量的 对象。
量变引起质变。
CSV文本格式,带格式的txt, excel直接支持打开

需求: 将数据库百万数据导出到excel中 系统数据的备份(样式)

1)先将数据导出到xls格式的excel文件中
2)Invalid row number (65536) outside allowable range (0…65535)
百万数据可以分批次进行导出(分不同sheet),就可以很好避免堆内存溢出的问题
再升级SXFFS对象
它不支持打开模板文件

小巧的内存监控工具JDK自带的jvisualvm

1)加大jdk配置的内存,
2)eclipse配置的内存
3)Tomcat 配置

© SXSSFWorkb ookijnt rowAccessWindowSize)-
高版本的poi才有,3.0之后的版本

三.细粒度权限控制 部门编码

1.当事人查看自己的记录
2.部门经理查看当前部门下员工所添加的记录
3.总经理查看所有记录
4.查询当前部门及下属部门
100 国际物流集团 from Detp where id like ‘100%’
100100 总裁办
100101 财务部 from Dept where id like ‘100101%’
100101100工资组
Yyyyy
yyyyyyyy
100101101社保组
zzzzz
Xxx
Xxxx
Xxxxx
From Contract where createDept inClOOlOl; '100101100 'lOOlOHOl7)
From Contract where createDept like '100101%z
100102 船运部 from Dept where id like ‘100102%’
100102100装箱部
100102101委托部
100199 救火队

思考:跨部门跨人员的细粒度权限控制如何实现?

四.出口报运模块

国际物流运输的货物到国外,这个过程需要经过海关人员的审批。所以公司对于出 口的产品就要进行出口报运,就需要形成出口报运单,将来公司的报运人员,需要拿 着出口报运单到海关进行审批。而出口报运单需要打印出来,打印的数据来自于数据 库表。
要设计好出口报运的相关表结构。

五.打断设计思想

就是在传统的一对多关系中,都会在多方加入一个一方的主键作为它的外键,但 是在打断设计思想指导下,不会这样实现,它会在一方的表中加入一个冗余字段,用 于保存多方的主键,并且用指定的分隔符进行分隔。
真正的实现原理:就是通过打段字段,实现数据的冗余,从而一样的可以解决一个 报运单下有多个购销合同的问题。
此时的表结构

想知道出口报运单,报运了哪些货物和附件?

传统做法:
1.出口报运单对象 加载出购销合同的集合 遍历得到每个购销合同- 通过购销合同得到货物 再通过货物得到附件。
2 .打断设计基础上的做法
出口报运单对象 得到它的一个字段(购销合同id形成的集合) 直接到 货物表中进行查询(from Contractproduct cp where cp.contract.id in (购销合同 id 形成 的集合))
如果按传统设计方法:

财务想知道这笔款项对应货物/附件是哪个生产厂家生产的。

财务单…
报运单
发票(催款通知单)
委托单

购销合同优化:
代码优化
算法优化
数据库表结构优化(数据结构的优化)

六.跳跃查询

就是在实现数据查询时,可以跳过中间表而直接进入目标查询对象,从而提高查 询速度。
跳跃查询的前提:先进行表结构的打断设计。
一对多可以打断
多级一对一可以打断

使用打断设计+跳跃查询实现

给出标准:

当关联查询的层级大于4层时,就要考虑打断设计。这样可以借助跳跃查询实现查询 速度翻倍。
数据库设计上的问题:
早期项目开发交付客户使用后,一切正常。但随着数据量的量变到质变,结果就是系 统响应时间成线性増长。系统运行半年后,客户无法承受等待时间。

七.再次优化:数据搬家

表级别的数据冗余。在添加一个出口报运单时,就能得到这个报运单所报运的货物 和附件,如何实现报运单下货物和附件有数据,实现原理就是首先找到购销合同对象, 再得到购销合同下的货物和附件,针对货物和附件分别进行数据拷贝。
实现手段
手动通过程序代码实现的
实现跳跃查询的前提是:
提前采用打断设计进行表的优化。而打断设计思想的关键是字段的冗余,就是在报 运单中加入一个冗余字段,放入的是购销合同的id集合

八.出口报运模块的实现

1.加入三个P0类及映射文件
2.Hibernate.cfg.xml中添加三个映射文件
3.Service接口及实现类编写及配置
4.Action编写及配置
5.注意:修改数据库表的module_p的数据

将你的表中数据,调成与上面相同

九.作业

L完成读程的工作,并实现购销合同的打印功能
2.完成出口报运单的生成
3.完成报运单的査询&删除&查询详情,更新操作有难度(可以暂时不实现)
4.实现细粒度权限控制之管理本部门及下属部门

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值