Announcement

Collapse
No announcement yet.

TADOConnection: Sleeping statt DisConnect

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • TADOConnection: Sleeping statt DisConnect

    Hallo,

    beim Verwenden der TADOConnection (unter MS SQL 7, Patch 6, KeepConnection = True) tritt folgendes Problem auf: Bei einem Disconnect vom Client wird die Verbindung serverseitig auf Sleeping gesetzt und erst nach ca. 2min tatsächlich disconnected. Wird innerhalb dieser Zeit eine neue Connection (gleiches Login) aufgebaut, verwendet der Server auch eine neue Connection. Wir diese disconnectet, wird sie vom Server ebenfalls zunächst in den Sleepingmodus versetzt.

    Jetzt kommt's: Wird innerhalb der ca. 2min nochmal eine Connection aufgebaut, verwendet der Server eine der schlafenden Verbindungen (sie wird quasi recyvcled). Dies wäre nicht weiter schlimm. Aber in der betreffenden Anwendung wird im AfterConnect-Event der ADOConnection die eine Anwendungsrolle aktiviert (mit sp_setapprole). Dies ist jedoch nur erlaubt, wenn diese nicht bereit aktiviert wurde (was bei der sleeping Connection der Fall war). Also gibt es nach dem dritten Connect eine Exception vom Server (die man freilich im Client abwürgen könnte).

    Wie kann man also erreichen, dass bei einem Disconnect die Verbindung tatsächlich abgebrochen wird, anstatt in den Sleepingmodus versetzt zu werden? Alternativ: wie kann ich beim Aktivieren der Approle mit sp_setapprole ermitteln, ob diese schon gesetzt wurde?

    Es hat leider nicht geholfen, KeepConnection auf False zu setzen, da wir die Verbindung auch ohne geöffnete Abfragen herstellen wollen, diese (Verbindung) aber sofort nach dem Connect (keine offnen Abfragen) wieder geschlossen wird.

    Falls jemand eine Lösung für diess Probelem weiss, wäre es nett, diese mitzuteilen, da dieses Problem mittlerweile zeitkritisch wird (die Anwendung soll nächste Woche beim Kunden installiert werden ;-).

    Mit freundlichen Grüßen
    Markus Peters

  • #2
    Hallo,

    jeder Verbindungsaufbau über einen OLE DB-Provider oder einen ODBC-Treiber aktiviert als Vorgabewert den Datenbankverbindungs-Pool, der prozessweit wirksam ist. Somit ist das geschilderte Verhalten (Datenbankverbindung wird nicht sofort getrennt) normal.

    Allerdings steht im Fall des Zugriffs über den OLE DB-Provider für den Microsoft SQL Server das Deaktivieren des Pools zur Verfügung, wenn die Zeichenkette "<b>OLE DB Services=-8</b>" an den Connection-String angehängt wird. Der folgende Auszug stammt aus einem Beispielprojekt, dass ist in der letzten Wochen auf den Entwickler Tagen 2001 verwendet habe:
    <pre>
    procedure TForm1.CheckBoxConnectClick(Sender: TObject);
    begin
    if CheckBoxConnect.Checked then
    begin
    if CheckBoxOLEDBServices.Checked then
    ADOConnection1.ConnectionString := FNewConnectionString
    else
    ADOConnection1.ConnectionString := FOrgConnectionString;
    ADOConnection1.Connected := True;
    ADODataSet1.Active := True;
    end
    else
    begin
    ADODataSet1.Active := False;
    ADOConnection1.Connected := False;
    end;
    with MemoConnectionString do
    begin
    Lines.Clear;
    Lines.Add(ADOConnection1.ConnectionString);
    end;
    end;

    procedure TForm1.FormCreate(Sender: TObject);
    begin
    FOrgConnectionString := 'Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=Northwind;Data Source=(local);';
    FNewConnectionString := 'Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=Northwind;Data Source=(local);OLE DB Services=-8;';
    end;
    </pre>
    Die Anweisung OLE DB Services=-8 wird jedoch nur dann berücksichtigt, wenn kein Client Cursor verwendet wird. Das sofortige Trennen kann gut im <b>Profiler</b> des SQL Server 7 nachvollzogen werden

    Comment

    Working...
    X