J'utilise OCCI avec C++ pour obtenir des données d'Oracle. Le code fonctionne bien, mais j'ai remarqué une diminution des performances. Cela arrive parce que dans l'itération rset-> next(), certains calculs prennent du temps. L'impact de ce délai est que le pool de connexion Oracle a une connexion occupée. Si des requêtes simultanées demandent le même calcul, la connexion peut-être dans le pool sera BUSY.Copier Occi :: ResultSet avant de fermer 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);
Donc, ma question est la suivante: Puis-je copier le Occi :: ResultSet (à l'aide d'un pointeur partagé?) Afin de fermer la connexion après la copie et faire le calcul après avoir relâché la connexion?
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
}
Des exemples disponibles sur GitHub? La requête d'exécution ne récupère pas les données.
Si cela est possible, créez un objet de classe et stockez chaque information brute dans l'objet de classe et stockez-la dans une carte. Faites-le lorsque le programme est chargé. –