Bagaimana cara menyambung kembali ke UIBDatabase + UIBTransaction yang sama setelah kehilangan jaringan?

Kami memiliki aplikasi Delphi7 + UIB + Firebird 2.5 untuk restoran pizza, bekerja dengan stabil di jaringan kabel.
Namun di wifi, (bekerja dengan TabletPC Win8/Win10,) jika koneksi terputus, UIBDatabase tidak dapat menyambung kembali secara otomatis.

(Saat ini kami sedang merekonstruksi seluruh APLIKASI untuk menghapus "sisa IBX", tetapi setelah memutakhirkan UIB ke versi terbaru, masalahnya tampaknya menjadi lebih buruk!)

Setelah koneksi terputus, pesan kesalahan. adalah:

Project ...exe raised exception class EUIBError with message 'connection rejected by remote interface
Connection not established
GDS Code: 335544421 - SQL Code: -923 - Error Code: 101'. Process stopped. 

Meskipun saya mencoba menutup koneksi saat ini dengan .IsConnected:=False atau .CancelAbort Koneksi tidak dapat tersambung kembali lagi:

Project ...exe raised exception class EUIBError with message 'invalid statement handle
Unsuccessful execution caused by system error that does not preclude successful execution of subsequent statements
GDS Code: 335544485 - SQL Code: -901 - Error Code: 165'. Process stopped. Use Step or Run to continue.

Jadi, apa pun yang kami lakukan, kami tidak dapat terhubung kembali!

Kasus terburuk adalah ketika TabletPC masuk ke mode tidur, karena koneksi pasti terputus, namun komponen mengira masih online. Dibutuhkan minimal 8 detik untuk menyadari bahwa kueri tidak dapat dijalankan.

Kami telah mencoba memulai TTimer sebelumnya untuk membatalkan paksa operasi setelah 2000 md, tetapi peristiwa itu tidak pernah dipicu.

Jadi saya bertanya-tanya:

  • Apakah ada cara untuk menangani kasus ini dengan baik?
  • Tidak ada orang lain yang memiliki masalah seperti ini? (Merah setiap topik terkait di sini, ditemukan hanya 1 serupa dengan 0 solusi .)
  • Apakah komponen UIB saat ini dapat diunduh dari di sini tidak stabil? (Mengalami kesulitan untuk mengkompilasi di bawah D7 karena banyak kesalahan ketidakcocokan SynEdit!)
  • Mengapa .OnConnectionLoss acara dipicu hanya setelah saya mencoba menyambung kembali?
  • Apakah mungkin untuk menghubungkan kembali ke:
    Transaksi yang SAMA lagi,
    menyelesaikan kueri
    dan Melakukan & menutup dengan benar?
    (Karena kita dapat membaca transaksi tersebut ID dari Firebird.) ... sehingga server tidak perlu membiarkannya terbuka selama 2+ jam.

person SzakiLaci    schedule 07.09.2019    source sumber
comment
Jika Anda tetap melakukan semuanya lagi, Anda harus secara serius mempertimbangkan koneksi tanpa kewarganegaraan, seperti REST.   -  person Jerry Dodge    schedule 07.09.2019
comment
Seperti yang saya tulis: kami sedang merekonstruksi cara lama IBX yang terhubung tanpa henti ke cara baru. Sekarang tidak berfungsi dengan stabil sama sekali. Saya menghubungkan hanya untuk memeriksa perubahan. Hanya setelah menerima acara FB. Semua data disimpan dalam memori menggunakan variabel aman thread.   -  person SzakiLaci    schedule 07.09.2019
comment
@JerryDodge ‹OFF› Kami telah mencoba mengembangkan aplikasi seluler REST api +, yang berumur 4 tahun dan jutaan. Semuanya menjadi sampah. Tidak lagi. Kami membutuhkan solusi untuk masalah di atas. ‹/OFF›   -  person SzakiLaci    schedule 07.09.2019
comment
Jika saya berada dalam situasi Anda, saya bertanya pada diri sendiri, apa yang akan saya lakukan? Hal pertama yang akan saya lakukan adalah mengubah komponen database saya. Di Delphi 7, Anda mempunyai pilihan untuk menggunakan IBX atau DBX dengan driver Upscene Productions Firebird. (Anda dapat menemukannya di mesin wayback)   -  person nolaspeaker    schedule 07.09.2019


Jawaban (1)


Kesalahan 1:
Secara tidak sengaja mengetik tpConsistency dan bukannya tpConcurrency di 1 tempat ca.50.
Hal itu MENGUNCI seluruh tabel, sehingga tidak mungkin untuk terhubung kembali

Kesalahan 2:
Disarankan untuk menyetel myTransaction.DefaultAction := etmRollback;

Kesalahan 3:

Kode UIB salah di uiblib.pas.

  • Variabel FLockTimeout dan LockTimeout harus bilangan bulat!
  • Kode parameter TETAP:
    function CreateTRParams(Options: TTransParams; const LockRead, LockWrite: string{$IFDEF FB20_UP}; LockTimeout: integer{$ENDIF}): RawByteString;
    ...
      begin
      {$IFDEF FB20_UP}
      if LockTimeout = 0 then
          Exclude(Options, tpLockTimeout)
      else begin // -1 = infinite,   1..2048M = seconds
          Exclude(Options, tpnoWait);
          Include(Options, tpWait );
          Include(Options, tpLockTimeout);
      end;
      {$ENDIF}
      if Options = [tpConcurrency,tpWait,tpWrite] then
        result := ''
      else
        begin
          Result := isc_tpb_version3;
          for tp := Low(TTransParam) to High(TTransParam) do
            if (tp in Options) then
            begin
              case tp of
                tpLockRead   : ParseStrOption(tpc[tp], AnsiString(LockRead));
                tpLockWrite   : ParseStrOption(tpc[tp], AnsiString(LockWrite));
              {$IFDEF FB20_UP}
                tpLockTimeout : 
    //old code: PAnsiChar(@LockTimeout)[0] + PAnsiChar(LockTimeout)[1]; << [1] causing AV error
                  case LockTimeout of
                    -1     : Result := Result + tpc[tp] + #4#127#255#255#255;
    //               0     : Result := Result + tpc[tp] + #1#0; // this would be invalid
                    1..255: Result := Result + tpc[tp] + #1 + AnsiChar(Byte( LockTimeout and $FF));
                  else //256..32k
                            Result := Result + tpc[tp] + #2 + AnsiChar(Byte((LockTimeout div $FF) and $FF)) + AnsiChar(Byte(LockTimeout and $FF));
                  end;
              {$ENDIF}
              else
                Result := Result + tpc[tp];
              end;
            end;
        end;
    end;

Permintaan fitur 4
Tidak menemukan solusi apa pun untuk menyambung kembali ke transaksi SAMA yang sebelumnya hilang.

person SzakiLaci    schedule 10.09.2019
comment
Anda tidak akan dapat menghubungkan kembali transaksi SAMA yang sebelumnya hilang karena Firebird akan mendeteksi koneksi yang hilang dan mengakhiri transaksi. Anda harus terhubung kembali dan membuka transaksi baru. Sejauh yang saya mengerti Anda menggunakan transaksi yang sudah berjalan lama, ini adalah cacat desain yang serius. Transaksi Anda harus sesingkat mungkin. - person ZeDalaye; 26.09.2019