2017-10-11 29 views
6

Oracle'dan veri almak için C++ ile C++ kullanıyorum. Kod iyi çalışıyor, ancak bazı performans düşüşlerini fark ettim. Bunun nedeni, rset-> next() yinelemesinde bazı hesaplamaların zaman almasıdır. Bu gecikmenin etkisi, oracle bağlantı havuzunun bir bağlantının meşgul olması. Aynı anda talepler aynı hesaplamayı talep ediyorsa, havuzdaki tüm bağlantı belki de BUSY olacaktır. Kopyalama Occi :: Sonuç Occi'yi kapatmadan önce :: Bağlantı

 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); 

Benim soru: Ben Occi :: ResultSet (? Paylaşılan işaretçi kullanarak) sırayla kopya SONRA bağlantıyı kapatmak ve bağlantıyı bırakmadan sonra hesaplaması yapmak kopyalayabilir miyim?

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'da kullanılabilen örnekler var mı?

+0

Mümkünse, bir sınıf nesnesi oluşturun ve her bir ham bilgiyi sınıf nesnesine depolayın ve bir haritada saklayın. Program yüklendiğinde yapın. –

cevap

1

Veritabanına bağlantıyı kapatmak ve sonuç kümesini (occi :: ResultSet) daha sonra kullanmak üzere kaydetmek mümkün değildir. Bunun bir nedeni occi :: ResultSet :: next'in veri tabanından veri almasıdır. Bunun yerine sonuçları almak için dizi getirme ve kullanıcı tarafından ayrılmış bir veri arabelleği kullanabilirsiniz. occi :: ResultSet :: setDataBuffer kullanım

Örnek:

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); 

Not bu dizi arama başına numRows kadar getirir ve bu

Status next(
    unsigned int numRows =1); 

içinde prefetch gibi davranır getir.

+0

Mümkünse, bir sınıf nesnesi oluşturun ve her bir ham bilgiyi sınıf nesnesine depolayın ve bir haritada saklayın. Program yüklendiğinde yapın. –

-1

Yürütme sorgusu veri almıyor. Rset-> next() öğesini kullanarak sunucudan veri okuyorsunuz. Bağlantıyı sonlandırırsanız, verileri okuyamazsınız

+0

Bunu biliyorum. Hesaplamayı yapmadan tüm sonuçları elde eden bir çözüm arıyorum. Bağlantıyı kapatın ve sonuçları daha sonra doğrulayın. – cateof

İlgili konular