JDBC を使用して Oracle から BLOB データをダウンロードしようとしています。ブロブ データを取得する平均応答時間を知るために、JMeter を使用して、1 つまたは複数のスレッドで取得ブロブ データ Java プログラムを呼び出しています。しかし、理解できない奇妙な応答時間が得られました。
以下のいくつかのテストを試しました。(blob データのサイズは 1M です)
1.Jmeter を使用して 1 つのスレッドで BLOB データを取得する
2.Jmeter を使用して 2 つのスレッドで BLOB データを取得する
3. 2 つのスレッドで JMeter を使用して同じテーブル内の異なる BLOB データを取得する
4. 2 つのスレッドで Jmeter を使用して、異なるテーブルの異なる BLOB データを取得します。
.テスト 1 と 2 から、テスト 2 の応答時間がテスト 1 のほぼ 2 倍であることがわかりました。これは理解できません (私のサーバーには 4 つのコアがあり、誰もそれを使用していません)。同じブロブデータを取得するとロックがかかっているのではないかと思うので、テスト3を試してみました。しかし、応答時間はテスト2とほぼ同じです。そして、アクセス時にロックがあるかどうかを確認するためにテスト4を試しました。同じ表ですが、テスト 4 の応答時間もテスト 3 と同じです。
オラクルは同時に多くのユーザーの要求を処理できると思うので、テストから得た結果を理解できません。blobデータを同時に取得する場合、オラクルにはいくつかの制限がありますか?
ブロブデータを取得するためのコードは次のとおりです
public SampleResult runTest(JavaSamplerContext arg0) {
////
try {
Class.forName(JDBC_CLASS_NAME);
conn=DriverManager.getConnection(JDBC_THIN+dbserverIp+":"+port+":"+sid,dbuser,userPwd);
statement=conn.createStatement();
rs=statement.executeQuery(sqlText);
responseStr=RESPONSE_DATA_OK_HEAD+KAIGYOU_CODE;
if(rs.next()){
String fileId=rs.getString(FILE_ID_COLUMN_NAME);
oracle.sql.BLOB blob=((OracleResultSet)rs).getBLOB(BLOB_COLUMN_NAME);
in=blob.getBinaryStream();
int size=blob.getBufferSize();
byte[] buffer=new byte[size];
int len=-1;
bos=new ByteArrayOutputStream();
while((len=in.read(buffer))!=-1){
readCount=readCount+1;
bos.write(buffer,0,len);
}
byte[] blobValues=bos.toByteArray();
responseStr=responseStr+fileId+","+blobValues.length+","+readCount+KAIGYOU_CODE;
}else{
responseStr=RESPONSE_DATA_ZERO;
}
} catch (Exception e) {
e.printStackTrace();
getNGSampleResult(e,sr);
return sr;
}finally{
try {
if(rs!=null){
rs.close();
rs=null;
}
if(statement!=null){
statement.close();
statement=null;
}
if(conn!=null){
conn.close();
conn=null;
}
if(in!=null){
in.close();
in=null;
}
if(bos!=null){
bos.close();
bos=null;
}
} catch (Exception e) {
e.printStackTrace();
getNGSampleResult(e,sr);
return sr;
}
}
sr.sampleEnd();
sr.setSuccessful(true);
sr.setResponseCodeOK();
sr.setResponseMessageOK();
sr.setResponseData(responseStr,"UTF-8");
sr.setDataType(SampleResult.TEXT);
return sr;
}
ここにテスト計画があります
<?xml version="1.0" encoding="UTF-8"?>
<jmeterTestPlan version="1.2" properties="2.1">
<hashTree>
<TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="Test Plan" enabled="true">
<stringProp name="TestPlan.comments"></stringProp>
<boolProp name="TestPlan.functional_mode">false</boolProp>
<boolProp name="TestPlan.serialize_threadgroups">false</boolProp>
<elementProp name="TestPlan.user_defined_variables" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="User Parameter" enabled="true">
<collectionProp name="Arguments.arguments">
<elementProp name="env_test_date" elementType="Argument">
<stringProp name="Argument.name">env_test_date</stringProp>
<stringProp name="Argument.value">20130202</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
<elementProp name="env_test_case" elementType="Argument">
<stringProp name="Argument.name">env_test_case</stringProp>
<stringProp name="Argument.value">Run at the same time</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
<elementProp name="env_test_filesize" elementType="Argument">
<stringProp name="Argument.name">env_test_filesize</stringProp>
<stringProp name="Argument.value">1M</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
<elementProp name="env_test_thread" elementType="Argument">
<stringProp name="Argument.name">env_test_thread</stringProp>
<stringProp name="Argument.value">2users</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
</collectionProp>
</elementProp>
<stringProp name="TestPlan.user_define_classpath"></stringProp>
</TestPlan>
<hashTree>
<ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="ULDLtest" enabled="true">
<stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
<elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="loop controller" enabled="true">
<boolProp name="LoopController.continue_forever">false</boolProp>
<intProp name="LoopController.loops">-1</intProp>
</elementProp>
<stringProp name="ThreadGroup.num_threads">2</stringProp>
<stringProp name="ThreadGroup.ramp_time">1</stringProp>
<longProp name="ThreadGroup.start_time">1358319600000</longProp>
<longProp name="ThreadGroup.end_time">1358328499000</longProp>
<boolProp name="ThreadGroup.scheduler">true</boolProp>
<stringProp name="ThreadGroup.duration">300</stringProp>
<stringProp name="ThreadGroup.delay"></stringProp>
</ThreadGroup>
<hashTree>
<JavaSampler guiclass="JavaTestSamplerGui" testclass="JavaSampler" testname="Java DL BLOB Request" enabled="true">
<elementProp name="arguments" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" enabled="true">
<collectionProp name="Arguments.arguments">
<elementProp name="SQL_TEXT" elementType="Argument">
<stringProp name="Argument.name">SQL_TEXT</stringProp>
<stringProp name="Argument.value">select * from t_download_file_data t where t.file_id='testdata1M.csv'</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
<elementProp name="DB_USER" elementType="Argument">
<stringProp name="Argument.name">DB_USER</stringProp>
<stringProp name="Argument.value">xxxx</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
<elementProp name="USER_PWD" elementType="Argument">
<stringProp name="Argument.name">USER_PWD</stringProp>
<stringProp name="Argument.value">xxxx</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
<elementProp name="SID" elementType="Argument">
<stringProp name="Argument.name">SID</stringProp>
<stringProp name="Argument.value">xxxxx</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
<elementProp name="DBSERVER_IP" elementType="Argument">
<stringProp name="Argument.name">DBSERVER_IP</stringProp>
<stringProp name="Argument.value">xxx.xx.xx.xx</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
<elementProp name="PORT" elementType="Argument">
<stringProp name="Argument.name">PORT</stringProp>
<stringProp name="Argument.value">1521</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
</collectionProp>
</elementProp>
<stringProp name="classname">sample.TestSamplerClient</stringProp>
</JavaSampler>
<hashTree/>
<ResultCollector guiclass="TableVisualizer" testclass="ResultCollector" testname="Reust for table" enabled="false">
<boolProp name="ResultCollector.error_logging">false</boolProp>
<objProp>
<name>saveConfig</name>
<value class="SampleSaveConfiguration">
<time>true</time>
<latency>true</latency>
<timestamp>true</timestamp>
<success>true</success>
<label>true</label>
<code>true</code>
<message>true</message>
<threadName>true</threadName>
<dataType>true</dataType>
<encoding>false</encoding>
<assertions>true</assertions>
<subresults>true</subresults>
<responseData>false</responseData>
<samplerData>false</samplerData>
<xml>true</xml>
<fieldNames>false</fieldNames>
<responseHeaders>false</responseHeaders>
<requestHeaders>false</requestHeaders>
<responseDataOnError>false</responseDataOnError>
<saveAssertionResultsFailureMessage>false</saveAssertionResultsFailureMessage>
<assertionsResultsToSave>0</assertionsResultsToSave>
<bytes>true</bytes>
</value>
</objProp>
<stringProp name="filename"></stringProp>
</ResultCollector>
<hashTree/>
<ResultCollector guiclass="ViewResultsFullVisualizer" testclass="ResultCollector" testname="Result for graph" enabled="false">
<boolProp name="ResultCollector.error_logging">false</boolProp>
<objProp>
<name>saveConfig</name>
<value class="SampleSaveConfiguration">
<time>true</time>
<latency>true</latency>
<timestamp>true</timestamp>
<success>true</success>
<label>true</label>
<code>true</code>
<message>true</message>
<threadName>true</threadName>
<dataType>true</dataType>
<encoding>false</encoding>
<assertions>true</assertions>
<subresults>true</subresults>
<responseData>false</responseData>
<samplerData>false</samplerData>
<xml>true</xml>
<fieldNames>false</fieldNames>
<responseHeaders>false</responseHeaders>
<requestHeaders>false</requestHeaders>
<responseDataOnError>false</responseDataOnError>
<saveAssertionResultsFailureMessage>false</saveAssertionResultsFailureMessage>
<assertionsResultsToSave>0</assertionsResultsToSave>
<bytes>true</bytes>
</value>
</objProp>
<stringProp name="filename"></stringProp>
</ResultCollector>
<hashTree/>
<ResultCollector guiclass="StatVisualizer" testclass="ResultCollector" testname="Report" enabled="true">
<boolProp name="ResultCollector.error_logging">false</boolProp>
<objProp>
<name>saveConfig</name>
<value class="SampleSaveConfiguration">
<time>true</time>
<latency>true</latency>
<timestamp>true</timestamp>
<success>true</success>
<label>true</label>
<code>true</code>
<message>true</message>
<threadName>true</threadName>
<dataType>true</dataType>
<encoding>false</encoding>
<assertions>true</assertions>
<subresults>true</subresults>
<responseData>false</responseData>
<samplerData>false</samplerData>
<xml>true</xml>
<fieldNames>false</fieldNames>
<responseHeaders>false</responseHeaders>
<requestHeaders>false</requestHeaders>
<responseDataOnError>false</responseDataOnError>
<saveAssertionResultsFailureMessage>false</saveAssertionResultsFailureMessage>
<assertionsResultsToSave>0</assertionsResultsToSave>
<bytes>true</bytes>
</value>
</objProp>
<stringProp name="filename">log\ULDLPerformance_${env_test_case}_${env_test_thread}_${env_test_filesize}_${env_test_date}.jtl</stringProp>
</ResultCollector>
<hashTree/>
</hashTree>
</hashTree>
</hashTree>
</jmeterTestPlan>