Oracle: Speicherbedarf steigt bei öffnen/schließen



  • Hallo,

    ich habe eine Frage bezüglich Datenbanken. Ich kann alles Notwendige machen (öffnen, schreiben, lesen, schließen), aber Probleme gibt es mit dem Speicherbedarf:
    Wenn ich in eine Oracle-DB öffne (ODBC) und schließe, z.B. in einer Endlosschleife, dann steigt der Speicherbedarf kontinuierlich (--> Task-Manager). Bei SQL SERVER passiert das jedoch nicht.

    Den Code vom DB-Zugriff habe ich mal grob angegeben. Habe das auch bei diversen anderen Quellen so gesehen. Habe das Gefühl bei Oracle werden die Handles nicht gelöscht.

    Kennt sich da jemand aus? Habe ich was übersehen?
    Konnte sonst keine weiteren Beiträge/Informationen mit diesem Problem finden.

    Danke im Voraus!

    void main() 
    {
    	SQLHENV henv = 0;
    	SQLHDBC hdbc = 0;
    	SQLHSTMT hstmt = 0;
    	SQLSMALLINT nSize = 0;
    	SQLRETURN sqlRet;
    
    	while(1)
    	{
    
    		SQLAllocHandle( SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv );
    
    		SQLSetEnvAttr( henv, SQL_ATTR_ODBC_VERSION, (void*) SQL_OV_ODBC3, 0 );
    
    		SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc );
    
    		sqlRet = SQLConnect( hdbc, (SQLCHAR*)"SQL_TEST", SQL_NTS, (SQLCHAR*)"", SQL_NTS, (SQLCHAR*)"", SQL_NTS );
    
    		if(hdbc)	
    			SQLDisconnect(hdbc);
    
    		if(hdbc)	
    			SQLFreeHandle( SQL_HANDLE_DBC, hdbc );
    
    		if(henv)		
    			SQLFreeHandle( SQL_HANDLE_ENV, henv );
    
    		hdbc = NULL;
    		henv = NULL;
    	}
    }
    


  • Vielleicht ist der Oracle ODBC Treiber Buggy. Wäre nicht der erste verbuggte ODBC Treiber der mir unterkommt 🙂
    Hast du schonmal gesucht ob's diesbezüglich irgendwelche Artikel im Inet gibt?
    Oder vielleicht gar ein Update für den Treiber?



  • hustbaer schrieb:

    Vielleicht ist der Oracle ODBC Treiber Buggy. Wäre nicht der erste verbuggte ODBC Treiber der mir unterkommt 🙂
    Hast du schonmal gesucht ob's diesbezüglich irgendwelche Artikel im Inet gibt?
    Oder vielleicht gar ein Update für den Treiber?

    Also ich habe es mit dem Oracle Treiber ("Oracle in OraClient10g_home1") und auch mit dem Microsoft Treiber ("Microsoft ODBC for Oracle") versucht. Mit beiden haben ich den selben Effekt.

    -->Kann der ODBC-Treiber überhaupt so verbuggt sein? ich meine die sind ja so weit verbreitet, so ein fataler Fehler wäre doch sofort aufgefallen.



  • Liefern die FreeHandle/Disconnect-Funktionen auch einen Rückgabewert? Könnte da etwas schiefgegangen sein?

    MfG SideWinder



  • SideWinder schrieb:

    Liefern die FreeHandle/Disconnect-Funktionen auch einen Rückgabewert? Könnte da etwas schiefgegangen sein?

    MfG SideWinder

    Ja, habe es eben nochmal getestet. Kriege bei den FreeHandle-/Disconnect-Befehlen eine "0" zurück (egal ob ORACLE oder SQL SERVER).
    "0" und "1" ist ja ok, solange nicht eine negative Zahl zurückgegeben wird.



  • 1. Bist du dir sicher dass es ein Fehler ist? Könnte doch auch ein Feature sein, ein lokaler Cache oder so. Geht das bis zum "memory exhausted"?
    2. Hast du mal auf otn nachgeschaut ob es die korrekten odbc-Versionen deiner server-release sind? Manchmal gibt es bei oracle Kombinationen Treiber-Lib <-> Server-Lib, die sich nicht vertragen. Patches?



  • busenbach schrieb:

    -->Kann der ODBC-Treiber überhaupt so verbuggt sein? ich meine die sind ja so weit verbreitet, so ein fataler Fehler wäre doch sofort aufgefallen.

    Ich kann mich noch gut erinnern als wir tagelang Memory-Leak gesucht haben, und dann im Endeffekt draufgekommen sind, dass irgendwas im ODBC Treiber für SQL Server pro geschlossener Connection einen Thread-Stack "stehen" liess. Also 1MB pro Connection. Nach 2000 Connections war auch immer schön "tilt".

    Das ist allerdings schon ziemlich lange her, so ~8 Jahre vielleicht.

    Soll heissen: sein kann alles. Wobei ich einen Fehler im ODBC Treiber für Oracle fast ausschliessen würde, wenn beide Treiber den selben Fehler zeigen. Kann entweder noch ein Fehler im gemeinsamen ODBC Teil sein, oder in irgendeiner Library von Oracle.

    Hm...

    Laufen Client und Server auf dem selben PC? Falls ja, probier mal die auf unterschiedlichen PCs laufen zu lassen. Und wo steigt der Speicherverbrauch, nur im Client Prozess, nur im Server Prozess oder in beiden?

    p.S.: Mag sein ich täusche mich und es war ne ADODB Geschichte, aber ich glaube es war eher ODBC (das "alte" Server-Programm hat ODBC verwendet, und die neueren waren IIRC nicht betroffen). Und auf jeden Fall war es MS SQL Server, denn was anderes hatten wir nie im Einsatz.



  • Ich habe es auf 2 verschiedenen Rechnern ausprobiert, bei beiden hatte ich den selben Effekt. Mit "steigendem Speicherbedarf" meine ich den Arbeitsspeicher, dazu schaue ich in den Task-Manager, habe es auch mit einem anderen Freeware-Programm probiert. Dieser steigt stetig mit jedem Verbindungsaufbau.

    Also generell gehe ich auch mal davon aus, dass es nicht am Treiber liegt, aber würde es dennoch mal mit einem Update probieren. Ich war auf der Seite:
    http://www.oracle.com/technology/software/tech/windows/odbc/index.html
    Welches müsste ich für "Oracle in OraClient10g_home1" da runterladen? Sehe das nicht wirklich raus.


Anmelden zum Antworten