ODBC-Fehler:"Zu viele aktive Benutzer" 3239
-
Hallo,
ich habe einen Server mit Access-2000-DB. Diese DB wird von 3 Clientrechnern und einer Aplication auf dem Server via ODBC angesprochen. Alle Programme sind in VC++ 6.0 erstellt.
Nach der Zeit X (5h bis 2 Tage) kommt es zu der Fehlermeldung 3239 "Zu viele aktive Teilnehmer" auf dem Server und es ist keine DB-Kommunkation mehr möglich. Laut MSDEV-Hilfe soll dies ab einer Teilnehmerzahl > 255 passiere.
Ich habe meine Software geprüft, so dass ich relativ sicher bin, dass pro Client und Serveranwendung nur eine aktive Verbindung zur DB und pro Tabelle existiert. Ich dürfte also maximal auf 10 aktive Verbindungen von 4 Teilnehmern kommen.Was habe ich sonst falsch gemacht, bzw. wo kann ich die aktiven Teilnehmer sehen um den Störenfried zu entlarven? Über schnelle Hilfe würde ich mich sehr freuen, es brennt!
Grüße
-
Hallo,
ein ähnliches Problem hatte ich auch einmal mit einer anderen Datenbank im Share-Betrieb (Adimens).
Die Ursache war damals, dass die angemeldeten Benutzer nicht korrekt abgemeldet wurden (z.B. Programmfehler / Absturz) und damit bei jeder Anmeldung die Anzahl der angemeldeten Benutzer bis über einen Maximalwert hinaus angestiegen ist.
Ich konnte das Problem nur lösen, indem ich auf eine Client/Server-Datenbank (MS SQL-Server) umgestiegen bin.
Vielleicht hat Access ja ein ähnliches Problem und deine Applikation beendet die Verbindung zur Datenbank nicht ordentlich?Edit: Ich habe gerade gesehen, dass du mit VC6++ und ODBC arbeitest.
Wenn du mit CREcordSet die Tabellen ansprichst und diese Recordets mit dem Assistenten standardmässig erstellst und öffnest (CMeinSet.Open()), dann wird für jede neu geöffnete Tabelle eine neue Verbindung zur Datenbank erstellt. Ein Programm kann somit durchaus mehrere Verbindungen (über CDatabase) haben.
Abhilfe: zunächst ein CDatabase-Objekt erstellen und öffnen und den CRecordset-Objekten beim öffnen einen Zeiger auf dieses CDatabase-Objekt mitgeben, dann wird für alle Tabellen nur eine Verbindung zúr Datenbank aufgebaut.
Und sicherstellen, dass zum Ende des Programms auch für jedes .Open() (CRecordset und CDatabase) ein .Close() vorhanden ist.
-
Dank für die schnelle Antwort!
Ich hatte eigentlich alles geprüft und meine DB-Tabellen-KLassen so aufgebaut, dass es immer nur ein Objekt geben kann, welches auf die DB-Tabelle zugreift (Ich verwende eine statische Semaphore, die für alle Objekte der Tabellen-Klasse identisch ist. Beim Zugriffsbeginn (Open) wird diese gesetz und beim Close wieder rückgesetzt.). So stelle ich eigentlich sicher, dass ich kein Close vergessen habe.Gibt es denn eine Möglichkeit sich alle aktiven Benutzer anzeigen zu lassen?
Vielleicht sollte ich für alle Abfragen pro Tabelle nur ein CRecordSet-Objekt benutzen... Ist vielleicht etwas unschön, aber wenn es funktioniert.
-
Bei Access weiß ich leider nicht, wie man sich aktuelle Benutzer anzeigen lassen kann. Beim SQL-Server geht dies schön über den Enterprise-Manager, vielleicht gibt es ja etwas ähnliches für Access? Oder vielleicht auf dem Server nachschauen, wie viele Benutzer Zugriff auf die Datenbank-Datei haben. Unter NT 4.0 ging dies über den Server-Manager; momentan verwenden wir den Server 2003, da wüsste ich jetzt nicht, wo so etwas zu finden ist...
Häufige Programm- oder Rechnerabstürze gibt es nicht, die das Schließen verhindern könnten? Eventuell einzelne User, die das "Herunterfahren" per Schalter/Steckdose bevorzugen?
-
Hallo erstmal,
die Clientrechner laufen 24h, Programmabstürze gibt es bei ihenn nicht. Nur die Applikation des Servers verabschiedet sich bei Auftreten des Fehlers.
Ich werde die Version versuchen, dass es nur ein Recordset pro Tabelle gibt. Und dann mal sehen.
Dank und Grüße