2017-10-11 75 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