Announcement

Collapse
No announcement yet.

Interbasezugriffe aus einem extra DB Thread?

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

  • Interbasezugriffe aus einem extra DB Thread?

    Hallo Community, erstmal ein großes Lob an alle.
    Sehr gutes Forum.
    Doch leider habe ich bis jetzt noch nichts zu meinem Problem gefunden.

    Folgendes:
    Ich arbeite mit D6 Prof. und InterBase_WI-V6.0.1-server.

    Die Schnittstelle zwischen Delphi und IB ist dbexpress.

    Jetzt zu meinem Proplem:
    Ich habe mir einen einen eigenen Datenbankthread erstellt, der bekommt die Anweisungen über einen Puffer zugeteilt und arbeitet diese dann ab.

    Das funktioniert auch alles soweit, wenn ich nicht zu schnell werde.
    Sobald ich schneller werde, bleibt das ganze Programm stehen, der Datenbankthread und sogar mein Thread zur COM Schnittstelle.

    Daraus ergibt sich für mich das die synchronisation zwischen thread,IB und dbexpress fehl schlägt.

    Hat jemand Erfahrungen mit Datenbankzugriffen aus einem Thread heraus?

    Danke für eure Antworten

  • #2
    Hallo Stefan,
    <br>
    ohne Deinen Code zu kennen gibt es bei multi-threaded Client-Anwendungen mit InterBase/Firebird zwei Regeln:
    <br>
    - Jeder Thread benötigt eine eigene Connection, und
    - Als Protokoll muss TCP/IP verwendet werden, auch wenn es sich um eine lokale Datenbank handelt.
    <br>
    Und eine weitere Regel, die nichts mit multi-threading zu tun hat: InterBase 6.0.1.0 ist ein Beta release und buggy und kann sogar Deine Datenbank zerstören. Wenn es schon InterBase 6 Open-Source sein soll, dann InterBase 6.0.1.6. Alternativen sind dann natürlich noch InterBase 7.5.1 (kostenpflichtig) oder Firebird 1.5 (frei verfügbar).
    <br>
    Schöne Grüße,
    Thoma
    Thomas Steinmaurer

    Firebird Foundation Committee Member
    Upscene Productions - Database Tools for Developers
    Mein Blog

    Comment


    • #3
      Hallo Thomas,
      <BR>
      danke für deine antwort.
      <BR>
      das mit dem protokoll hat mir geholfen und auch die info mit der 6.0.1.0 Version.
      <BR>
      aber so richtig verstehe ich das nicht, warum es nur über TCP/IP geht.
      <BR>
      Ich habe mir mal ein kleines Testprog gemacht, mit dem ich wahlweise Lokal oder LAN, Normal oder über den Thread speichere.
      <BR>
      Hier die Resultate:
      Speichern und Lesen war zur
      selben Zeit auf die selbe Datenbank.
      <BR>
      Speichern Normal über TCP/IP
      470 Lesezugriffe in 20sec
      470 Schreibzugriffe in 20sec
      <BR>
      Speichern mit Thread über TCP/IP
      208 Lesezugriffe in 20sec
      208 Schreibzugriffe in 20sec
      <BR>
      Speichern Normal Lokal
      292 Lesezugriffe in 20sec
      268 Schreibzugriffe in 20sec
      <BR>
      Speichern mit Thread Lokal
      112 Lesezugriffe in 20sec
      224 Schreibzugriffe in 20sec
      <BR&gt

      Comment


      • #4
        Hallo Stefan,
        das Problem bei der Sache ist, dass die InterBase Clientbibliothek für InterBase < 7.5 nicht thread-safe ist. Diese Einschränkung kann mit einer TCP/IP-Connection umgegangen werden, weil dann nicht IPC (Inter-Process-Communication) als Protokoll verwendet wird.
        <br>
        Die Clientbibliothek ist in InterBase 7.5 thread-safe, allerdings bedeutet das AFAIK, dass Anfragen serialisiert abgearbeitet werden, d.h. dass man es hier vermutlich mit einer Performancebremse zu tun hat.
        <br>
        Thoma
        Thomas Steinmaurer

        Firebird Foundation Committee Member
        Upscene Productions - Database Tools for Developers
        Mein Blog

        Comment

        Working...
        X