2017-10-11 35 views
6

我正在使用OCCI和C++從Oracle中獲取數據。代碼運行良好,但我注意到一些性能下降。發生這種情況是因爲在rset-> next()迭代中,一些計算需要時間。這種延遲的影響是oracle連接池有一個連接繁忙。如果併發請求需要相同的計算,則可能池中的所有連接都將處於繁忙狀態。在關閉前複製Occi :: ResultSet Occi ::連接

 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)以備後用。一個原因是occi :: ResultSet :: next從數據庫中檢索數據。相反,您可以使用數組提取和用戶分配的數據緩衝區來存儲結果。

使用OCCI ::結果集:: 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); 

注意,數組提取等預取行爲在於

Status next(
    unsigned int numRows =1); 

取高達每呼叫numRows行。

+0

如果可以創建類對象並將每個原始信息存儲到類對象中並將其存儲在映射中。當程序加載時執行它。 –

-1

執行查詢不檢索數據。您使用rset-> next()從服務器讀取數據。 因此,如果您終止連接 - 無法讀取數據

+0

我知道。我正在尋找一種解決方案,它可以在不進行計算的情況下執行所有結果集並關閉連接並稍後驗證結果集 – cateof