2017-10-11 11 views
6

OCCIをC++で使用してOracleからデータを取得しています。コードはうまく機能しますが、パフォーマンスが低下することに気付きました。これは、rset-> next()の繰り返しでは、計算に時間がかかるためです。この遅延の影響は、Oracle接続プールに1つの接続がビジー状態であることです。同時に要求が同じ計算を要求する場合、プール内の多分すべての接続はBUSYになります。Occi :: ResultSetを閉じる前にコピーOcci :: Connection

 Statement *stmt = conn->createStatement (sqlQuery); 

     ResultSet *rset = stmt->executeQuery(); 
     while (rset->next()) 
     { 
     //Slow computation takes time 
     compute() 
     } 

     stmt->closeResultSet (rset); 

     conn->terminateStatement (stmt); 
     env->terminateConnection (conn); 

だから私の質問です:私はOCCIをコピーすることができます:: ResultSetの(共有ポインタを使用して?)コピーした後、接続を閉じ、接続を解除した後の計算を行うためには?

go_to_oracle(ResultSet &result) { 
Statement *stmt = conn->createStatement (sqlQuery); 

    ResultSet *rset = stmt->executeQuery(); 

    copy_rset_to_result; 


    stmt->closeResultSet (rset); 

    conn->terminateStatement (stmt); 
    env->terminateConnection (conn); 
} 

my_method() { 

ResultSet *result = NULL 
go_to_oracle(result); 
//here connection is closed, but we have the data 
compute(result) // do this without have connection occupied 

} 

GitHubで利用できる例はありますか?

+0

クラスオブジェクトを作成し、各生の情報をクラスオブジェクトに格納し、マップに格納することができる場合は可能です。プログラムの読み込み時に実行します。 –

答えて

1

データベースへの接続を閉じて、後で使用できるように結果セット(occi :: ResultSet)を保存することはできません。理由の1つは、occi :: ResultSet :: nextがデータベースからデータを取得することです。その代わりに、配列フェッチとユーザー割り当てデータバッファを使用して結果を格納することができます。 OCCI ::のResultSet ::にsetDataBufferの使用の

例:

oracle::occi::ResultSet* rs=nullptr; 
//..... 
// query 
//..... 
static const size_t max_numrows=5000; 
char var_buf[max_numrows][7]; 
char sym_buf[max_numrows][9]; 
rs->setDataBuffer(1,var_buf,oracle::occi::OCCI_SQLT_STR,sizeof(var_buf[0]),(ub2*)0); 
rs->setDataBuffer(2,sym_buf,oracle::occi::OCCI_SQLT_STR,sizeof(sym_buf[0]),(ub2*)0); 
size_t fetch_count=0; 
while(rs->next(max_numrows)==ResultSet::DATA_AVAILABLE) 
{ 
    /* This would probably be an error as you would like 
     the whole result to fit in the data buffer.*/ 
} 
stmt->closeResultSet (rs); 
conn->terminateStatement (stmt); 
compute(var_buf,sym_buf); 

なお、アレイは、コールごとにnumRowsの数まで取り込むこと

Status next(
    unsigned int numRows =1); 

にプリフェッチのような作用をフェッチします。

+0

可能であれば、クラスオブジェクトを作成し、各生の情報をクラスオブジェクトに格納してマップに格納します。プログラムの読み込み時に実行します。 –

-1

実行クエリはデータを取得しません。 rset-> next()を使用してサーバーからデータを読み込みます。 接続を終了すると、データを読み取ることができません。

+0

私はそれを知っています。私は、計算を行わずにすべての結果セットを取るソリューションを探しています接続を閉じて、後で結果セットを検証します – cateof

関連する問題