Oracle FAQ Your Portal to the Oracle Knowledge Grid
HOME | ASK QUESTION | ADD INFO | SEARCH | E-MAIL US
 

Home -> Community -> Usenet -> c.d.o.misc -> Oracle ODBC Driver allocates additional memory

Oracle ODBC Driver allocates additional memory

From: Georg Weissenbacher <georg.weissenbacher_at_altavista.net>
Date: Fri, 04 Feb 2000 13:04:53 +0100
Message-ID: <389AC065.DAD6256E@altavista.net>


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

Original text of this message

HOME | ASK QUESTION | ADD INFO | SEARCH | E-MAIL US