Arien82
25-07-2011, 12:22
Salve a tutti,
sono nuova del forum e spero che qualcuno possa aiutarmi.
Sto sviluppando un'applicazione con Visual C++ 2008 e ho bisogno di accedere ad un database Access (.accdb) per inizializzare le mie strutture dati.
Credo di essere riuscita a fare tutto in maniena abbastanza corretta (i dati vengono letti), ma probabilmente sbaglio qualcosa nel rilascio delle varie strutture dati, perchč l'occupazione di memoria, una volta chiusa la connessione col DB, rimane invariata (osservando il Task Manager).
Ho tentato di fare un'analisi del problema creando un programma di test che, con un ciclo for, esegue 10000000 la connessione al db, una query di select e il rilascio delle strutture dati, e dalla sua esecuzione ho notato che l'occupazione della memoria continua ad aumentare.
Pių nello specifico, ho una classe del tipo:
class DB{
HRESULT hr;
CDataSource DataSource;
CSession Session;
CCommand<CDynamicStringAccessor> cmd;
public:
DB();
~DB();
void Connection();
int Query();
void Disconnection();
};
int DB::Connection(){
// Initialize the Component Object Module Library (COM)
hr = CoInitialize(NULL);
if (FAILED(hr))
{
cout<<"Failed to CoInitialize() COM."<<endl;
return -1;
}
// Open the connection and initialize the data source specified by the passed
// initialization string.
hr = dbDataSource.OpenFromInitializationString("PATH DB.accdb");
if (FAILED(hr))
{
return -1;
}
else
{
hr = Session.Open(DataSource);
if (FAILED(hr))
{
return -1;
}
}
return 0;
}
int DB::Query(CString query){
// Excecute the query and create a record set
hr = cmd.Open(Session, query);
if (SUCCEEDED(hr))
return 0;
else
return -1;
}
void DB::Disconnection(){
cmd.Close();
DataSource.Close();
Session.Close();
cout<<"Cleanup. Done."<<endl;
// Release the Component Object Module Library (COM)
CoUninitialize();
}
Il Main di prova č un semplice ciclo for:
void main (){
int ret;
for (int i = 0; i<10000000; i++){
DB *db = new DB();
ret = db->Connection();
if (ret < 0) cout << "DB Initialization error";
else {
ret = db->Query();
if (ret < 0) cout << "Query error";
}
db->Disconnection();
delete db;
}
}
}
Qualcuno sa indicarmi dove sbaglio?
Grazie in anticipo!
sono nuova del forum e spero che qualcuno possa aiutarmi.
Sto sviluppando un'applicazione con Visual C++ 2008 e ho bisogno di accedere ad un database Access (.accdb) per inizializzare le mie strutture dati.
Credo di essere riuscita a fare tutto in maniena abbastanza corretta (i dati vengono letti), ma probabilmente sbaglio qualcosa nel rilascio delle varie strutture dati, perchč l'occupazione di memoria, una volta chiusa la connessione col DB, rimane invariata (osservando il Task Manager).
Ho tentato di fare un'analisi del problema creando un programma di test che, con un ciclo for, esegue 10000000 la connessione al db, una query di select e il rilascio delle strutture dati, e dalla sua esecuzione ho notato che l'occupazione della memoria continua ad aumentare.
Pių nello specifico, ho una classe del tipo:
class DB{
HRESULT hr;
CDataSource DataSource;
CSession Session;
CCommand<CDynamicStringAccessor> cmd;
public:
DB();
~DB();
void Connection();
int Query();
void Disconnection();
};
int DB::Connection(){
// Initialize the Component Object Module Library (COM)
hr = CoInitialize(NULL);
if (FAILED(hr))
{
cout<<"Failed to CoInitialize() COM."<<endl;
return -1;
}
// Open the connection and initialize the data source specified by the passed
// initialization string.
hr = dbDataSource.OpenFromInitializationString("PATH DB.accdb");
if (FAILED(hr))
{
return -1;
}
else
{
hr = Session.Open(DataSource);
if (FAILED(hr))
{
return -1;
}
}
return 0;
}
int DB::Query(CString query){
// Excecute the query and create a record set
hr = cmd.Open(Session, query);
if (SUCCEEDED(hr))
return 0;
else
return -1;
}
void DB::Disconnection(){
cmd.Close();
DataSource.Close();
Session.Close();
cout<<"Cleanup. Done."<<endl;
// Release the Component Object Module Library (COM)
CoUninitialize();
}
Il Main di prova č un semplice ciclo for:
void main (){
int ret;
for (int i = 0; i<10000000; i++){
DB *db = new DB();
ret = db->Connection();
if (ret < 0) cout << "DB Initialization error";
else {
ret = db->Query();
if (ret < 0) cout << "Query error";
}
db->Disconnection();
delete db;
}
}
}
Qualcuno sa indicarmi dove sbaglio?
Grazie in anticipo!