2017-05-30 24 views
-4

OCCI(Oracle C++ Call Interface)と古いJDBCを比較したパフォーマンステストに非常に驚いています。ここでJDBCはOCCIよりも大幅に高速です。私は驚かなければならない?

はコードです:

package oraconnect.jdbc; 

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.Statement; 

public class OraconnectJdbc { 

    public static void main(String[] args) { 
     Connection conn = null; 
     Statement stm = null; 
     ResultSet rs = null; 

     try { 
      Class.forName("oracle.jdbc.driver.OracleDriver"); 
      conn = DriverManager.getConnection(
        "jdbc:oracle:thin:@127.0.0.1:1521:xe", "system", "******"); 
      stm = conn.createStatement(); 
      rs = stm.executeQuery("select * from CREDITO.movtos_cuentas"); 
      long count = 0; 
      while (rs.next()) { 
       count++; 
      } 

      System.out.printf("Registros na CREDITO.MOVTOS_CUENTAS: %d\n", count); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } finally { 
      if (rs != null) { 
       try { 
        rs.close(); 
       } catch (SQLException e) { 
        //Ignore 
       } 
      } 
      if (stm != null) { 
       try { 
        stm.close(); 
       } catch (SQLException e) { 
        //Ignore 
       } 
      } 
      if (conn != null) { 
       try { 
        conn.close(); 
       } catch (SQLException e) { 
        //Ignore 
       } 
      } 
     } 
    } 
} 

実行::

#include <iostream> 
#include <cstdlib> 
#include <occi.h> 

using namespace oracle::occi; 
using namespace std; 

const string username = "system"; 
const string password = "******"; 
const string url  = "(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=XE)))"; 
const string sql  = "select * from CREDITO.movtos_cuentas"; 

int main(int argc, char** argv) { 

    cout << "Oracle Connectivity" << endl; 

    Environment *env = Environment::createEnvironment(Environment::DEFAULT); 
    Connection *conn = env->createConnection(username, password, url); 
    Statement *stm = conn->createStatement(sql); 
    ResultSet *rs = stm->executeQuery(); 

    unsigned long count = 0; 

    while (rs->next()) { 
     count++; 
    } 

    stm->closeResultSet(rs); 
    conn->terminateStatement(stm); 
    env->terminateConnection(conn); 
    Environment::terminateEnvironment(env); 

    cout << "Registros na CREDITO.MOVTOS_CUENTAS: " << count << endl; 

    return 0; 
} 

そしてここでは、Javaコードで

C++バージョン

time LD_LIBRARY_PATH=/home/eduardo/Private/Oracle/instantclient_11_2/. ./oraconnect 

Javaバージョン

time java -jar oraconnect-jdbc.jar -cp lib/oracle-driver-11.2.0.3.jar 

C++結果:

real 1m29.392s 
user 0m32.788s 
sys  0m20.812s 

Javaの結果:

real 0m28.404s 
user 0m12.076s 
sys  0m4.236s 

結論:

Javaが大幅に高速化したよりもC++

私が作った場合、私は疑問に思います間違いや悪い実践的なものを使用したeとC++バージョン誰も私がこの結果を理解するのを助けることができますか?

+3

彼は質問を投稿し、次は何が起こるのか信じられない! –

+0

NathanOliver、結果が掲載されました。 – filosofisto

+0

結論 - あなたが2番目に走ったのは、すでにたくさんのデータがディスクから引き出され、SGAに座っていたために速くなりました。 –

答えて

0

時間を測定したので、違いは有効です。 あなたが理解したいのは、彼らがなぜ違うのかを理解するには、時間全体をいくつかの部分に分割して、それらが似ているか違うかを確認する必要があります。その違いの理由を理解する。 これは、バイナリ上の呼び出しスタックのトレースやサンプリング、ネットワーク層や他の多くのtcpdumpの実行など、さまざまな方法で行うことができます。 非常に便利な方法は、OracleデータベースでSQL_TRACEを有効にしています。そこには、時間が費やされる場所に多くの情報があります。 SQL_TRACEを有効にする方法についての良い紹介はhttps://oracle-base.com/articles/misc/sql-trace-10046-trcsess-and-tkprofです。 これらのトレースファイルには多くのデータが含まれており、特に最初は読みにくいものです。これらのファイルを処理するには、いくつかのツール(ほとんどは "Profiler"と呼ばれます)が利用できます。 (私の見解から)主要製品はMethod-R Profilerですが、これはお金がかかりますので、代わりにhttps://antognini.ch/2017/03/tvdxtat-4-0-beta-11/を試してみてください。

これ以上の情報がなくても、パフォーマンスの違いの理由は誰にも分かりません。しかし、利用可能なツールを使用すると、それらを識別することができます。あるソリューションを他のソリューションよりも速く受け入れるか、またはそれを修正します。

は編集:私は例を提供します : 他の多くの理由の他には、デフォルトの動作に差がある: OCCIは一度に2行をフェッチ:デフォルトでは Accessing Oracle Database Using C++

、プリフェッチがオンになり、データベースは常に ローをフェッチします。

しかし、JDBC 10の結果セットがあります。デフォルトでは Database JDBC Developer's Guide - Result Set

をOracleのJDBCは、クエリを実行するとき、それは結果はデー​​タベース・カーソルから一度に10行の を設定して取得します。

したがって、OCCIでjdbcを使用した場合の5倍のネットワークラウンドトリップが発生する可能性があります。

これは一例にすぎません。あなたの観察の理由かもしれません。確かに、あなたは、推測を推測したり推測したりする必要はありません。

+0

Martinさん、ありがとうございました。あなたの提案が良いことを理解していただければ幸いです。しかし、それはローカルデータベースへの1つの接続とテーブル内の簡単なSELECTを持つ非常に簡単なテストです。私はJavaがOCCI(C++用のOracleソリューション)を使用したC++より3倍高速であることは非常に驚きでした。私にとっては驚くべき結果です。 – filosofisto

+0

私はオラクルのソリューション(OCCI)が良い解決策であるかどうか質問します。 – filosofisto

+0

こんにちはマーティン、実際に私がフェッチサイズを等化したとき、その差はおおよそでしたが、JDBCはまだOCCIより優れていました。 OCCI = 19秒、JDBC = 12秒。 – filosofisto

関連する問題