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);} Received on Fri Feb 04 2000 - 06:04:53 CST
}
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);