Używam OCCI z C++, aby uzyskać dane z Oracle. Kod działa dobrze, ale zauważyłem spadek wydajności. Dzieje się tak, ponieważ w czasie wykonywania rset-> next() niektóre obliczenia wymagają czasu. Wpływ tego opóźnienia polega na tym, że pula połączeń Oracle ma zajęte jedno połączenie. Jeśli jednocześnie żądania wymagają tego samego obliczenia, być może wszystkie połączenia w puli będą BUSY.Kopiuj Occi :: ResultSet przed zamknięciem 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);
Więc moje pytanie brzmi: Czy mogę skopiować occi :: ResultSet (za pomocą udostępnionego wskaźnik?), Aby zamknąć połączenie po egzemplarzu i wykonać obliczenia po zwolnieniu połączenia?
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
}
Wszelkie przykłady dostępne na GitHub?
Jeśli jest to możliwe, utwórz obiekt klasy i zapisz każdą surową informację w obiekcie klasy i zapisz ją na mapie. Zrób to po załadowaniu programu. –