1

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=&apos;testdata1M.csv&apos;</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>
4

2 に答える 2

1

あなたがそれをコーディングしたときあなたは測定しています:-dbへの接続-blob読み取り-接続を閉じる

JDBC構成要素を使用できます。

http://jmeter.apache.org/usermanual/component_reference.html#JDBC_Connection_Configuration

サンプリングする前に接続が確立されるようにします。

次に、jdbcリクエストがDB接続にアクセスするためにどのように機能するかを確認して、コードを変更します。

 conn = DataSourceElement.getConnection("Variable Name used in JDBC_Connection_Configuration");
于 2013-02-10T10:09:45.140 に答える
1

Oracleデータベースは、十分なハードウェアがあれば、数十万の同時ユーザーに拡張できます。したがって、表示される結果は、ハードウェアの制限またはプログラムの作成方法の欠陥によるものです。

たとえば、サーバーに単一のコアがある場合、サーバーは一度に1つのことしか実行できません。したがって、2人のユーザーがそれに反対して実行すると2倍の時間がかかります。それが実際に起こっていることではなく、それがどのようなものであるかを説明するだけです。

于 2013-02-06T13:06:28.657 に答える