基于实体(视图)VO的数据库分页

上传人:jiups****uk12 文档编号:38472836 上传时间:2018-05-02 格式:DOC 页数:6 大小:884KB
返回 下载 相关 举报
基于实体(视图)VO的数据库分页_第1页
第1页 / 共6页
基于实体(视图)VO的数据库分页_第2页
第2页 / 共6页
基于实体(视图)VO的数据库分页_第3页
第3页 / 共6页
基于实体(视图)VO的数据库分页_第4页
第4页 / 共6页
基于实体(视图)VO的数据库分页_第5页
第5页 / 共6页
点击查看更多>>
资源描述

《基于实体(视图)VO的数据库分页》由会员分享,可在线阅读,更多相关《基于实体(视图)VO的数据库分页(6页珍藏版)》请在金锄头文库上搜索。

1、 NC 供应链第 1 页 共 6 页基于实体(视图)基于实体(视图)VO 的数据库分页的数据库分页皮之兵 2012-05-25关键词:关键词:数据库分页;自动分页大小;1. 背景背景1.1. 数据分页背景数据分页背景在中间件内存批量处理实体(视图)VO【后续简称为 VO】时,由于中间件内存 是有最大限制的,如果一次性批量处理的 VO 过多,可能会导致中间件内存的内 存溢出,导致中间件宕机,引发一系列问题。因此,考虑到中间件内存的大小限制,我们在事务处理过程中,采用对 VO 进行 分页分批处理,保证每一批 VO 的内存大小在一个固定值范围,这个固定值远远 低于中间件 jvm 最大内存,并且在每一

2、批处理结束之后,jvm 可以将其占用的内 存进行回收,从而不会导致中间件 jvm 的内存溢出。1.2. 实现实现 VO 分页背景分页背景在本文之前,PUBAPP 分页算法中,有两个默认的分页实现 返回 ID 的默认实现 nc.impl.pubapp.pattern.page.db.IDDBPage 返回泛型 E 的默认实现 nc.impl.pubapp.pattern.page.db.DBPage1.2.1.返回类型不满足返回类型不满足在本文之前,PUBAPP 分页算法中,有两个默认的分页实现 返回 ID 的默认实现 nc.impl.pubapp.pattern.page.db.IDDBPag

3、e 返回 ID 的默认实现不符合我们分页返回 VO 的要求,因此不能采用此实现。1.2.2.使用不方便使用不方便 返回泛型 E 的默认实现 nc.impl.pubapp.pattern.page.db.DBPage 此默认实现可以满足返回 VO 的要求,但是需要传入构造参数中有两个参数, IRowSetMap rowsetMap, ITableMeta table,在使用的时候需要构造一个 IRowSetMap 的实现类,同时要创建 ITableMeta 对象,非常不方便。因此考虑到这些情况,我们做了一个返回 VO 的默认实现,只需传入相应的 SQL,查询的列名数组和分页时用到的临时表名就可以

4、了。NC 供应链第 2 页 共 6 页1.2.3.分页大小需人工指定分页大小需人工指定上述两个默认实现对于每次分页的大小设置,一是在调用实现的时候传入一个固 定的值,如果不传入的话就是用默认实现里的默认值。 这样存在一个问题,调用者需要很清晰的知道每一条记录占用的内存大小,从而 估算分页大小,这样对调用者要求较高,而且可能会因为估算不准确而导致后续 的问题。2. 使用场景使用场景需要从数据库读取大量 VO 数据并在中间件内存进行处理的场景。例如: 全月平均计算过程中,需要将计算出的出库成本回写到库存相应的单据上,在调 用库存回写接口之前,需要在内存中组织好相关的数据参数,由于回写是以单据 明细

5、行为基础,当计算的单据明细数据量超过一定量级的时候,如果采用直接从 数据库将所有数据加载到内存,就会导致中间件内存溢出,这个时候就需要采用 VO 的数据库分页算法。NC 供应链第 3 页 共 6 页3. 实现原理实现原理3.1. 类图说明类图说明主要类及接口说明: AbstractVODBPage抽象类,实现 IPage 接口,同时负责根据 IpageInfo 信息自动计算分页大小及构 建 DBPage 类所需的参数 ITableMeta。 IPageInfo注册查询的列名数组、查询 SQL 和分页时需要创建的临时表名。需要调用者实 现 VODBPage继承自 AbstractVODBPage

6、,实现两个方法,返回对应列的列元数据信息和 IRowSet 结果集翻译为对应实体 VO 的对象。 ViewDBPage继承自 AbstractVODBPage,实现两个方法,返回对应列的列元数据信息和NC 供应链第 4 页 共 6 页IRowSet 结果集翻译为对应视图 VO 的对象。3.2. 自动分页大小实现自动分页大小实现3.2.1.计算一条记录占用内存计算一条记录占用内存根据每个列对应的元数据信息,获取其数据类型和数据长度,根据类型和长度得 到该列在内存中占用的字节数,再将所有列对应的字节数加和,得到所有列一条 记录占用的内存总大小。 StringString 对象(空字符串)本身占用

7、20 个字节,包括引用占用:2 * lenth + 20 Bytes BigDecimalBigDecimal 对象(空值对象)占用 28 个字节,包括引用占用:2 * lenth + 28 Bytes UFDoubleUFDouble 对象(空值对象)占用 13 个字节+1 位,包括引用占用:2 * lenth + 13 Bytes IntegerInteger 对象占用 8 个字节,包括引用占用:8Bytes UFBooleanUFBoolean 对象占用 4 个字节+1 位,包括引用占用:4 Bytes UFDateUFDate,UFDateTime 对象占用 12 个字节位,包括引用占

8、用:12 Bytes UFDateTimeUFDate,UFDateTime 对象占用 12 个字节位,包括引用占用:12 Bytes UFLiteralDateUFDate,UFDateTime 对象占用 12 个字节位,包括引用占用:12 Bytes UFTimeUFDate,UFDateTime 对象占用 12 个字节位,包括引用占用:12 Bytes MDEnumMDEnum 对象(空值对象)占用 8 个字节,包括引用占用:2 * lenth + 8 BytesNC 供应链第 5 页 共 6 页3.2.2.获取分页大小获取分页大小根据一次分页内存占用的设定值(默认 10MByte)大小

9、除以每条记录的内存值得 到分页大小。 例如,一行记录占用内存 500Byte,一次分页内存占用设定为 10MByte,那么分 页值大小为 10MByte/500Byte20000。即每次分页行记录数为 20000。4. 使用示例使用示例4.1. 创建一个创建一个 IPageInfo 的实现,注册分页信息的实现,注册分页信息例如 public enum PageInfo implements IPageInfo / 存货总账月末计算分页信息GL_MONTHCALC(“TEMP_IA_MONTHCALC“, new String FieldConst.PK_GROUP, FieldConst.PK

10、_BOOK, FieldConst.PK_ORG,FieldConst.CINVENTORYID, FieldConst.CCALCRANGEID, FieldConst.FPRICEMODEFLAG,FieldConst.NABGLOBALMNY, FieldConst.NABGROUPMNY,FieldConst.NABMNY,FieldConst.NABNUM, FieldConst.NABPLANEDMNY,FieldConst.NABVARYMNY, FieldConst.NMONTHPRICE, FieldConst.NVARIANCERATE);/* 对应列名数组*/privat

11、e String columns;/* 对应查询 SQL 语句*/private String sql;/* 临时表名*/private String temptable;private PageInfo(String temptable, String columns) this.temptable = temptable;this.columns = columns;NC 供应链第 6 页 共 6 页Overridepublic String getColumns() return this.columns;Overridepublic String getSql() return thi

12、s.sql;Overridepublic String getTemptable() return this.temptable;public void setColumns(String columns) this.columns = columns;public void setSql(String sql) this.sql = sql;public void setTemptable(String temptable) this.temptable = temptable;4.2. 创建分页实例创建分页实例String sql = / PageInfo info = PageInfo. GL_MONTHCALC;/获取 PageInfo info.setSql(sql);/设置查询 SQL IPage page = new VODBPage(GeneralNABVO.class, info);/创建分页 实例while (page.hasNext() GeneralNABVO vos = page.next();/返回分页数据/ 相关处理

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号