| Oracle FAQ | Your Portal to the Oracle Knowledge Grid | |
Home -> Community -> Usenet -> c.d.o.misc -> Oracle ODBC Driver allocates additional memory
I am using Oracle ODBC Driver 8.0.5.7 with Oracle 8.0.5.
We make thousends of requests on the database in a loop. The problem is,
that the ODBC driver allocates 4Kb blocks periodically ( happens perhabs
on every 100th execution) and doesn't free them, if I bind a parameter
to the statement.
Once the statement is prepared and all parameters and columns are bound, the statement is executed and fetched in a loop. As this should be a never ending application, the memory allocation becomes a problem. If I don't bind a parameter and add the value of the parameter to the statement and call SQLExecDirect each time, no memory is allocated, but then we have a performance problem :-)
Is there any known bug or workaround ? Or is there a mistake of mine ?
Hope someone can help me !
ciao
Joe
Here is the code, which makes problems
void main( int argc, char **argv )
{
SQLCHAR tableName[30];
SQLCHAR tableSpace[30];
SQLCHAR paramOwner[30];
SQLINTEGER cbTableName;
SQLINTEGER cbTableSpace;
SQLINTEGER cbParamOwner;
SQLHANDLE hsqlDbc; // connection handle to database
SQLHANDLE hsqlEnv; // environment handle to database
SQLHSTMT hsqlStmt;// statement handle
SQLRETURN retcode;// return code of the recent SQL command
SQLCHAR stmt[] = "SELECT table_name, tablespace_name "\
"FROM all_tables WHERE owner=?";
int i, j;
retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &hsqlEnv);
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO)
exit(1);
// Set the ODBC version environment attribute
retcode = SQLSetEnvAttr(hsqlEnv, SQL_ATTR_ODBC_VERSION,
(void*)SQL_OV_ODBC3, 0);
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO)
exit(1);
// Allocate connection handle
retcode = SQLAllocHandle(SQL_HANDLE_DBC, hsqlEnv, &hsqlDbc);
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO)
exit(1);
// Set login timeout to 5 seconds.
SQLSetConnectAttr(hsqlDbc, SQL_LOGIN_TIMEOUT, (void *)5, 0);
// Connect to data source
retcode = SQLConnect(hsqlDbc, (SQLCHAR*)"dsn", SQL_NTS,
(SQLCHAR*) "username", SQL_NTS,
(SQLCHAR*) "password", SQL_NTS);
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO) {
SQLFreeHandle(SQL_HANDLE_DBC, hsqlDbc);
SQLFreeHandle(SQL_HANDLE_ENV, hsqlEnv);
exit(1);
}
retcode = SQLAllocHandle(SQL_HANDLE_STMT, hsqlDbc, &hsqlStmt);
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO) {
SQLDisconnect( hslqDbc);
SQLFreeHandle(SQL_HANDLE_DBC, hsqlDbc);
SQLFreeHandle(SQL_HANDLE_ENV, hsqlEnv);
exit(1);
}
retcode= SQLPrepare(hsqlStmt, stmt, SQL_NTS);
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO) {
SQLDisconnect( hslqDbc);
SQLFreeHandle(SQL_HANDLE_STMT, hsqlStmt);
SQLFreeHandle(SQL_HANDLE_DBC, hsqlDbc);
SQLFreeHandle(SQL_HANDLE_ENV, hsqlEnv);
exit(1);
}
// bind parameter
retcode = SQLBindParameter(hsqlStmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR,
SQL_CHAR,
30, 0, (void*)paramOwner, 30, &cbParamOwner);
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO) {
SQLDisconnect( hslqDbc);
SQLFreeHandle(SQL_HANDLE_STMT, hsqlStmt);
SQLFreeHandle(SQL_HANDLE_DBC, hsqlDbc);
SQLFreeHandle(SQL_HANDLE_ENV, hsqlEnv);
exit(1);
}
// bind all result columns to variables
retcode = SQLBindCol(hsqlStmt, 1, SQL_C_CHAR, tableName, 30,
&cbTableName);
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO) {
SQLDisconnect( hslqDbc);
SQLFreeHandle(SQL_HANDLE_STMT, hsqlStmt);
SQLFreeHandle(SQL_HANDLE_DBC, hsqlDbc);
SQLFreeHandle(SQL_HANDLE_ENV, hsqlEnv);
exit(1);
}
retcode = SQLBindCol(hsqlStmt, 2, SQL_C_CHAR, tableSpace, 30,
&cbTableSpace);
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO) {
SQLDisconnect( hslqDbc);
SQLFreeHandle(SQL_HANDLE_STMT, hsqlStmt);
SQLFreeHandle(SQL_HANDLE_DBC, hsqlDbc);
SQLFreeHandle(SQL_HANDLE_ENV, hsqlEnv);
exit(1);
}
j = 0;
while (j < 5000)
{
if (j > 0) { // close cursor only if opened before next execution
retcode = SQLCloseCursor(hsqlStmt);
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO) {
SQLDisconnect( hslqDbc);
SQLFreeHandle(SQL_HANDLE_STMT, hsqlStmt);
SQLFreeHandle(SQL_HANDLE_DBC, hsqlDbc);
SQLFreeHandle(SQL_HANDLE_ENV, hsqlEnv);
exit(1);
}
}
strcpy((char*)paramOwner, "SYS"); // init parameter
cbParamOwner = SQL_NTS;
retcode = SQLExecute( hsqlStmt);
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO) {
SQLDisconnect( hslqDbc);
SQLFreeHandle(SQL_HANDLE_STMT, hsqlStmt);
SQLFreeHandle(SQL_HANDLE_DBC, hsqlDbc);
SQLFreeHandle(SQL_HANDLE_ENV, hsqlEnv);
exit(1);
}
do
{
retcode = SQLFetchScroll(hsqlStmt, SQL_FETCH_NEXT, 0);
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
printf(" %30s %30s\n", tableName, tableSpace);
}
else SQLCloseCursor(hsqlStmt);
}
while (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO);
j++;
}
// cleanup
SQLFreeStmt(hsqlStmt, SQL_CLOSE);
SQLFreeStmt(hsqlStmt, SQL_UNBIND);
SQLFreeStmt(hsqlStmt, SQL_RESET_PARAMS);
SQLFreeHandle(SQL_HANDLE_STMT, hsqlStmt);
SQLDisconnect(hsqlDbc);
SQLFreeHandle(SQL_HANDLE_DBC, hsqlDbc);
SQLFreeHandle(SQL_HANDLE_ENV, hsqlEnv);
}
Received on Fri Feb 04 2000 - 06:04:53 CST
![]() |
![]() |