Bagaimana menerapkan Multiuser Custom Counter di Jet 4.0 dan ADO 2.1

Terjemahan Artikel Terjemahan Artikel
ID Artikel: 240317 - Melihat produk di mana artikel ini berlaku.
Perbesar semua | Perkecil semua

Pada Halaman ini

RINGKASAN

Karena Microsoft Jet database engine memiliki cache membaca dan menulis yang malas, Anda bisa mendapatkan nilai-nilai duplikat di bidang kustom meja Anda jika dua aplikasi menambahkan catatan dalam waktu kurang dari yang dibutuhkan untuk cache untuk refresh dan mekanisme menulis malas untuk flush ke disk. Artikel ini menyajikan metode yang memperhitungkan faktor-faktor ini.

INFORMASI LEBIH LANJUT

Microsoft Jet database engine menyediakan lapangan meja (AutoIncrement). Dimulai dengan Jet 4.0, Anda dapat menentukan nilai awal dan peningkatan nilai. Ini memecahkan sebagian besar kebutuhan untuk menggunakan sebuah counter kustom yang pengguna dari versi sebelumnya dari Jet. Namun, jika counter Anda nilai teks atau tidak meningkatkan jumlah yang tetap, langkah-langkah yang dijelaskan dalam artikel ini mungkin manfaat aplikasi Anda.

Microsoft Jet telah membaca-cache yang diperbarui setiap PageTimeout milidetik (default adalah 5000ms = 5 detik). Ini juga memiliki mekanisme menulis malas yang beroperasi di thread terpisah untuk pemrosesan utama dan dengan demikian menulis perubahan ke disk asynchronously. Mekanisme dua ini membantu meningkatkan kinerja, tetapi dalam situasi tertentu yang memerlukan concurrency tinggi, mereka dapat menciptakan masalah.

Microsoft Jet 4.0 OLEDB penyedia dan perpustakaan jenis Microsoft Jet dan benda-benda replikasi menyediakan dua metode untuk memastikan bahwa aplikasi Anda memiliki data saat ini:

  • JetEngine objek RefreshCache metode.
  • "Jet OLEDB:Transaction komit Mode" properti sambungan.

JetEngine objek RefreshCache metode

Ada baca-cache terpisah untuk setiap objek sambungan. Memanggil RefreshCache metode dari objek JetEngine, seperti terpapar oleh Microsoft Jet dan perpustakaan jenis objek replikasi, segera menyegarkan baca-cache untuk objek sambungan yang melewati sebagai argumen metode. Baca-cache untuk semua objek sambungan lain dalam aplikasi tidak terpengaruh.

"Jet OLEDB:Transaction komit Mode" koneksi properti

Di Microsoft Jet 2.x dan sebelumnya, menulis semua yang segera berkomitmen. Dengan Win32 dan multi-threading, Microsoft Jet memperkenalkan mekanisme menulis malas. Pengaturan properti ini ke nilai 1 menyebabkan semua transaksi komit segera ditulis ke disk untuk objek sambungan. Semua objek sambungan lain tidak terpengaruh.

Metode ini lebih baik untuk mengubah nilai registri untuk mendapatkan efek yang sama karena Anda dapat mengendalikan tepat di mana Anda memerlukan nilai ini dan mereka lebih deterministik dalam operasi. Program global registri akan mempengaruhi performa mesin di daerah lain dan dalam aplikasi lainnya.

CONTOH

Contoh berikut menyediakan fungsi untuk menghasilkan nomor meja kustom dan penanganan concurrency dan mengunci isu-isu yang hasil dari proses. Ini melibatkan penggunaan tabel kedua untuk menyimpan nilai kunci tersedia berikutnya. Ini digunakan untuk alasan kinerja dan juga untuk menghindari negatif mempengaruhi pengguna yang hanya perlu membaca data.

Fungsi utama adalah NextKeyValue. It menerima tiga argumen:
  • Objek sambungan
  • Nama tabel
  • Peningkatan nilai
Peningkatan nilai opsional dan default ke 1. Fungsi membuka tabel menggunakan kursor sisi server, transaksi, dan pesimis mengunci dan kemudian membaca nilai dari field pertama catatan pertama. Ini adalah nilai kunci kembali. Ini kemudian akan menambahkan nilai untuk pengguna berikutnya dan rilis meja.

Ketika Anda mengatur nilai awal dalam tabel, ini adalah nilai pertama yang dikembalikan oleh fungsi.

Penanganan kesalahan dirancang untuk menangani masalah penguncian membuka meja. Jika kunci waktu habis, fungsi mengembalikan-1 sebagai nilai kunci berikutnya. Jika terjadi kesalahan lain, fungsi menimbulkan galat run-time yang aplikasi utama akan perlu perangkap.

Karena kebanyakan orang meninggalkan pengaturan registri tersentuh, Microsoft Jet biasanya akan memiliki 100ms penundaan antara kunci mencoba lagi. Jika semua contoh dari Jet memiliki keterlambatan sama, ini dapat mengakibatkan situasi ras dan menyebabkan aplikasi Anda untuk waktu habis lebih dari diperlukan. The NextKeyValue fungsi menetapkan kunci coba lagi ke interval acak antara 60 dan 150 milidetik untuk mengurangi kemungkinan terjadi kondisi ras. Pengujian aplikasi bertanggung jawab untuk menggunakan pernyataan acak untuk biji nomor acak generator.

Aplikasi tes menambahkan 100 Record untuk tabel. Tidak melaksanakan apapun tetapi penanganan kesalahan paling dasar untuk menangani kunci timeout antara program dan lain-lain seperti itu.

Microsoft menyediakan pemrogaman hanya untuk ilustrasi, tanpa garansi baik tersurat maupun tersirat, termasuk, namun tidak terbatas pada, jaminan tersirat mengenai keadaan yang dapat diperjualbelikan dan/atau kesesuaian untuk tujuan tertentu. Artikel ini mengasumsikan bahwa Anda sudah familiar dengan bahasa pemrograman yang ditunjukkan dan alat-alat yang digunakan untuk membuat dan memperbaiki prosedur. Profesional dukungan Microsoft dapat membantu menjelaskan fungsionalitas prosedur tertentu, tetapi mereka tidak akan mengubah contoh tersebut untuk menyediakan fungsionalitas tambahan atau membuat prosedur untuk memenuhi kebutuhan spesifik Anda.
Jika Anda memiliki terbatas pengalaman pemrograman, Anda mungkin ingin menghubungi Microsoft Certified Partner atau Microsoft Advisory Services. Untuk informasi lebih lanjut, kunjungi situs Web Microsoft ini:

Microsoft Certified Partner- https://Partner.Microsoft.com/global/30000104

Microsoft Advisory Services- http://support.Microsoft.com/GP/advisoryservice

Untuk informasi lebih lanjut tentang opsi dukungan yang tersedia dan tentang cara menghubungi Microsoft, kunjungi Website Microsoft berikut:http://support.Microsoft.com/default.aspx?scid=Fh;EN-US;CNTACTMS

Database Setup

  1. Dalam Microsoft Access, buka NWind.MDB file, dan membuat tabel berikut:
               Table: KeyStore
          Field Name: NextValue
                Type: Number, Long Integer
    
          Field Name: Dummy
                Type: Number, Long Integer
    
               Table: KeyTest
          Field Name: ID
                Type: Number, Long Integer
    
          Field Name: Description
    
                Type: Text, 50
    
    					
  2. Buka tabel KeyStore dan menambahkan catatan. Mengatur NextValue jumlah dari mana Anda ingin counter Anda untuk memulai. Sebagai contoh: 3.
  3. Menyimpan catatan dan menutup Microsoft Access.

Program tes

  1. Buka baru Visual Basic atau Visual Basic untuk aplikasi proyek dengan bentuk (Form1) dan sebuah modul (Module1).
  2. Dari Project menu, pilih Referensi dan menambahkan referensi ke objek ActiveX Data Microsoft perpustakaan 2,1 (atau lambat) dan Microsoft Jet dan replikasi 2,1 (atau lambat) perpustakaan objek.
  3. Tambahkan kode berikut ke modul:
    Option Explicit
    
    Private Const MAX_RETRIES = 10
    
    Function NextKeyValue(cn As ADODB.Connection, _
                          ByVal TableName As String, _
                          Optional Increment As Long = 1) As Long
    Dim OldCommitMode As Long, rs As Recordset, ErrorCount As Long
    Dim TempKeyValue As Long, Jet As JRO.JetEngine, InTrans As Boolean
      NextKeyValue = -1   ' returns this if the routine times out
      OldCommitMode = cn.Properties("Jet OLEDB:Transaction Commit Mode")
      cn.Properties("Jet OLEDB:Transaction Commit Mode") = 1
      cn.Properties("Jet OLEDB:Lock Delay") = 90 + Int(Rnd * 60)
      Set rs = New ADODB.Recordset
      Set Jet = New JRO.JetEngine
      On Error GoTo NKV_Error
      rs.Open TableName, cn, adOpenDynamic, adLockPessimistic, adCmdTableDirect
      cn.BeginTrans
      InTrans = True
    NKV_InnerRetry:
      If rs.EditMode Then rs.CancelUpdate
      rs!Dummy = 0            ' lock the record
      Jet.RefreshCache cn     ' get current data
      TempKeyValue = rs(0)    ' .UnderlyingValue gives an error
      rs(0) = TempKeyValue + Increment
      rs.Update
      InTrans = False
      cn.CommitTrans
      rs.Close
      cn.Properties("Jet OLEDB:Transaction Commit Mode") = OldCommitMode
      NextKeyValue = TempKeyValue
      Exit Function
      
    NKV_Abort:
      On Error Resume Next
      If rs.EditMode Then rs.CancelUpdate
      cn.RollbackTrans
      rs.Close
      cn.Properties("Jet OLEDB:Transaction Commit Mode") = OldCommitMode
      Exit Function
    
    NKV_Error:
      Select Case Err.Number
        Case &H80004005
          ' Various locking errors (above)
          ErrorCount = ErrorCount + 1
          If ErrorCount < MAX_RETRIES Then
            Resume NKV_Abort
          ElseIf InTrans Then
            Resume NKV_InnerRetry
          Else
            Resume
          End If
        Case Else   ' unhandled errors
          Err.Raise Err.Number, Err.Source, Err.Description
      End Select
    End Function
    
    					
  4. Tambahkan tombol perintah (Command1) dan kotak teks (Text1) ke bentuk.
  5. Tambahkan kode berikut ke bentuk:
    Option Explicit
    
    Dim cn As ADODB.Connection
    
    Private Sub Command1_Click()
    Dim SQL As String, I As Long
      For I = 1 To 100
        SQL = "INSERT INTO KeyTest VALUES (" & _
              NextKeyValue(cn, "KeyStore", 10) & _
              ",'Test Record " & Me.hWnd & " " & Time & "')"
        On Error GoTo C1_Error
        cn.Execute SQL, , adExecuteNoRecords
        On Error GoTo 0
        Text1 = CStr(I)
        Me.Refresh
      Next I
      Exit Sub
      
    C1_Error:
      Resume
    End Sub
    
    Private Sub Form_Load()
      Randomize
      Set cn = New ADODB.Connection
      cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\\moonbase\public\northwind40.mdb"
    End Sub
    
    Private Sub Form_Unload(Cancel As Integer)
      cn.Close
    End Sub
    
    					
  6. Dalam Visual Basic, mengkompilasi aplikasi untuk EXE. Menjalankan aplikasi dari beberapa komputer dan klik Command1 pada saat yang sama. Itu akan berjalan untuk penyelesaian (Cegah kesalahan unhandled) dan kemudian Tambahkan catatan tanpa nomor ID duplikat.

CATATAN

  • KeyStore tabel tidak memerlukan indeks. Anda akan mendapatkan lebih baik kinerja dan memiliki lebih sedikit masalah jika Anda tidak menambahkan (atau mengizinkan akses Microsoft untuk menambahkan) dan indeks atau Primary Key ke meja.
  • Indeks lebih sedikit di KeyText meja, semakin baik. Indeks memiliki negatif efek pada kemampuan untuk kunci dan update data dengan cepat. Jika Anda memiliki masalah dalam aplikasi Anda, mencoba mengurangi jumlah indeks.
  • Tidak seperti Data akses objek (DAO) atau Remote Data objek (RDO), ADO tidak memiliki Mengedit metode. Untuk mengaktifkan penguncian pesimis, program memodifikasi "Bodoh" bidang dalam catatan untuk mendapatkan efek yang sama. Bidang ini telah ditambahkan ke meja semata-mata untuk tujuan ini dan tidak berisi informasi berguna.

REFERENSI

Untuk informasi lebih lanjut tentang Jet dan ADO, lihat:

Migrasi dari DAO ke ADO dan menggunakan ADO penyedia Jet
Untuk informasi tentang pelaksanaan sebuah counter kustom mutli-pengguna yang menggunakan Microsoft Data akses objek (DAO):

191253 Bagaimana menerapkan Multi-user Custom Counter di DAO 3.5

Properti

ID Artikel: 240317 - Kajian Terakhir: 20 September 2011 - Revisi: 2.0
Berlaku bagi:
  • Microsoft Visual Basic 5.0 Professional Edition
  • Microsoft Visual Basic 6.0 Professional Edition
  • Microsoft Visual Basic 5.0 Enterprise Edition
Kata kunci: 
kbclient kbdatabase kbhowto kbjet kbmt KB240317 KbMtid
Penerjemahan Mesin
PENTING: Artikel ini diterjemahkan menggunakan perangkat lunak mesin penerjemah Microsoft dan bukan oleh seorang penerjemah. Microsoft menawarkan artikel yang diterjemahkan oleh seorang penerjemah maupun artikel yang diterjemahkan menggunakan mesin sehingga Anda akan memiliki akses ke seluruh artikel baru yang diterbitkan di Pangkalan Pengetahuan (Knowledge Base) dalam bahasa yang Anda gunakan. Namun, artikel yang diterjemahkan menggunakan mesin tidak selalu sempurna. Artikel tersebut mungkin memiliki kesalahan kosa kata, sintaksis, atau tata bahasa, hampir sama seperti orang asing yang berbicara dalam bahasa Anda. Microsoft tidak bertanggung jawab terhadap akurasi, kesalahan atau kerusakan yang disebabkan karena kesalahan penerjemahan konten atau penggunaannya oleh para pelanggan. Microsoft juga sering memperbarui perangkat lunak mesin penerjemah.
Klik disini untuk melihat versi Inggris dari artikel ini:240317

Berikan Masukan

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com