【发布时间】:2017-05-10 19:40:56
【问题描述】:
在我的 JMeter 3.2 运行测试中,我有一个 JDBC 采样器,其设置如下:
<JDBCSampler enabled="true" guiclass="TestBeanGUI" testclass="JDBCSampler" testname="query1">
<stringProp name="dataSource">jdbcConfig_tpcds</stringProp>
<stringProp name="query">${__FileToString(sql/query1.sql)}</stringProp>
<stringProp name="queryArguments"/>
<stringProp name="queryArgumentsTypes"/>
<stringProp name="queryType">Select Statement</stringProp>
<stringProp name="resultVariable"/>
<stringProp name="variableNames"/>
<stringProp name="queryTimeout"/>
<stringProp name="resultSetHandler">Count Records</stringProp>
</JDBCSampler>
查询测试数据库性能并返回非常大的 ResultSet(~10M 记录)。
我不关心结果本身,所以 resultSetHandler 选项设置为 Count Records 所以我的期望是我会得到一个行数并且 ResultSet 将被关闭。然而,在这个长查询结束时,当 db 完成时,JMeter 失败并出现 OutOfMemoryError: Java heap space 错误,这很可能是由于 Java 试图处理可怕的 ResultSet。
我可以使用股票 JDBC 采样器做些什么还是需要自己编写?
我不能通过向查询中添加 LIMIT 等来限制 ResultSet,因为它是一个性能查询
附:这看起来不太好,因为在查看堆栈跟踪之后很明显,无论resultSetHandler 的值如何,JMeter 代码仍然循环遍历整个 ResultSet 并尝试将整个集合吸入内存
2017/05/05 00:07:42 ERROR - jmeter.threads.JMeterThread: Test failed! java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:3332)
at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:124)
at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:448)
at java.lang.StringBuilder.append(StringBuilder.java:136)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at org.apache.jmeter.protocol.jdbc.AbstractJDBCTestElement.getStringFromResultSet(AbstractJDBCTestElement.java:548)
at org.apache.jmeter.protocol.jdbc.AbstractJDBCTestElement.execute(AbstractJDBCTestElement.java:175)
at org.apache.jmeter.protocol.jdbc.sampler.JDBCSampler.sample(JDBCSampler.java:89)
【问题讨论】:
-
你是如何运行这些测试的?非 GUI 模式在侦听器数量较少的情况下更可取。
-
@NaveenKumarNamachivayam 是的,非 gui。但是我没有看到相关性。实际上,我花了一个下午的时间看代码。除非您正在执行存储过程(可调用语句),否则甚至不会考虑该设置
-
你的JMeter堆内存是多少?
标签: jdbc jmeter performance-testing resultset