欢迎使用普元产品知识库,本知识库包含普元应用开发平台EOSPlatform,流程平台BPS,企业服务总线ESB,微服务平台Microservice,运维管理平台Devops,数据集成平台DI

页面树结构

欢迎使用普元文档库

Skip to end of metadata
Go to start of metadata

【问题】

项目中发现: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>