欢迎使用普元产品知识库,本知识库包含普元应用开发平台EOSPlatform,流程平台BPS,企业服务总线ESB,微服务平台Microservice,运维管理平台Devops,数据集成平台DI
欢迎使用普元文档库
项目中发现:Platform 6.7 通过命名sql查询出的sdo数据对象占用内存较大,相同的查询sql语句,命名sql返回的查询结果占用内存大于通过queryEntitiesByTemplate构件查询、JDBC查询出的结果占用情况
场景:使用命名sql、queryEntitiesByTemplate、使用JDBC方式,从WFWORKITEM表中都查询10000、30000、50000条数据,对比查询结果的内存占用场景;
1、使用命名sql查询:
内存占用情况:
2、使用queryEntitiesByTemplate查询:
内存占用情况:
3、使用JDBC进行查询:
内存占用情况:
JDBC查询的数据量 | 内存占用 |
10000条 | 35.407M |
30000条 | 115.089M |
50000条 | 185.83M |
根据HeapDump分析,现返回的结果虽然都是DataObjectImpl 但是实际使用的方式是有差异的 。
- 通过queryEntitiesByTemplate方式查询,使用的是具体的SDO类型,不使用动态属性
- 通过Naming SQL查询,使用的是commonj.sdo.DataObject 即通过SDO的动态属性能力实现存储结果集
建议不要使用示例中的NamingSQL方式。用其他消耗内存少的方式实现。
如果一定想用NamingSQL,则建议返回值放入Java的Map中,再写程序输出到Excel或转成具体的DataObject类型。
示例如下:
<select id="select_query" parameterClass="java.util.HashMap" resultClass="java.util.HashMap">
<![CDATA[
select * from WFWORKITEM fetch first 20000 rows only
]]>
</select>