Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Menyinkronkan database klien SQLite dengan database server MySQL

Nah, Anda menyadari ini adalah masalah yang tidak sepele. Saya menulis perpustakaan untuk mencapai ini untuk aplikasi komersial tahun lalu dan butuh waktu sekitar 6 bulan untuk sampai ke tempat yang saya senangi.

Mengesampingkan argumen untuk menggunakan port 80 dan HTTP (TCP/IP) untuk menghindari masalah firewall dan dukungan, Anda perlu merancang sebuah protokol. Karena proyek saya sangat membutuhkan data, saya menggunakan protokol biner (bukan xml yang membengkak) yang dapat menangani data apa pun. Saya juga menginginkannya menjadi dua arah sehingga saya dapat MEMASUKKAN data serta menjalankan permintaan. Saya menggunakan CGI/FastCGI di server.

Protokol biner yang saya rancang cukup sederhana (selalu lebih baik) dan memecah transfer besar menjadi potongan ukuran yang ditentukan pengguna (sekitar 600k tampaknya bagus). Setiap potongan memiliki header diikuti oleh data.

Meskipun protokol ini dapat digunakan untuk mentransmisikan jenis data apa pun, biasanya protokol ini digunakan untuk data gaya database seperti yang disarankan pertanyaan Anda. Untuk mengakomodasi ini, saya memutuskan untuk menggunakan pendekatan baris/kolom pada desain. Data disimpan satu baris pada satu waktu artinya, setiap kolom disimpan untuk baris satu, kemudian semua kolom untuk baris 2 ... baris n.

Format data kolom tunggal adalah:

' Col1Type          1Bytes - BYTE     ' Data Type (REMSQL_TEXT etc)                
' Col1Len           4Bytes - DWORD    ' Length in bytes the Column Data                            - up to 4.2GB
' Col1Data          nBytes - BYTE     ' String data  

(dalam C, BYTE adalah CHAR)

Ini berarti bahwa setiap kolom memiliki deskriptor tipe data. Semua tipe data dapat direpresentasikan dengan:

REMSQL_NONE = 0    ' DataType undefined
REMSQL_QUAD = 1    ' 64-bit signed integer                
REMSQL_DBLE = 2    ' 64-bit IEEE floating point number
REMSQL_TEXT = 3    ' STRING - (CHAR) string of Ascii Bytes                                     
REMSQL_BLOB = 4    ' BLOB - (CHAR) string of Binary Bytes                                       
REMSQL_NULL = 5    ' NULL - Empty Column

Tipe data ini bertepatan dengan tipe data dasar SQLite dan secara numerik setara dengan enumerasi Tipe Data Dasar SQL3.

Dalam desain ini, jika bidang kosong (NULL) maka Anda hanya mengambil 5 byte untuk menyimpannya. Jika sebuah bidang memiliki 200 byte teks misalnya, hanya dibutuhkan 205 byte untuk menyimpannya. Manfaat yang lebih besar adalah dalam menguraikan data karena melewatkan kolom dapat dilakukan tanpa membaca semua 200 byte untuk menemukan beberapa karakter pengakhiran.

Header Chunk harus berisi hal-hal seperti, jumlah baris, jumlah kolom, total byte dll. Jika Anda menggunakan DWORD (bilangan bulat 64bit yang tidak ditandatangani) maka batas teoretis untuk chunk adalah 4.2gigs yang seharusnya cukup bahkan untuk transmisi jaringan lokal.

Implementasinya memerlukan penulisan pembungkus SQLite/MYSQL untuk fungsi ini. Saya menggunakan protokol BINARY secara eksklusif, yang membutuhkan sedikit waktu, tetapi pada dasarnya Anda memerlukan fungsi berikut:Sisi Klien:SendRequest() - Mengirim permintaan, menunggu respons

Sisi Server:ProcessRequest() - Menerima Permintaan, memprosesnya, dan mengembalikan respons

Dalam kasus saya, responsnya bisa berupa !00MB data atau lebih. Saya mengambil seluruh kumpulan data dari MySQL dan menyimpannya ke disk di server. Lalu saya mengembalikan potongan kosong yang berisi metrik kumpulan data. Klien kemudian meminta kumpulan data dalam potongan 600k, satu per satu. Jika sambungan terputus, sambungan hanya melanjutkan dari sambungan terakhir.

Akhirnya, kumpulan data sebagian besar berupa teks (nama alamat, dll.) sehingga siap untuk dikompresi. Keamanan adalah masalah yang sangat besar dalam hal ini sehingga enkripsi sangat penting. Ini memang menjadi sedikit lebih rumit untuk diterapkan, tetapi pada dasarnya Anda mengompres seluruh potongan, pad dengan panjang yang merupakan kelipatan dari blok cipher BLOCKSIZE dan mengenkripsinya.

Dalam proses semua ini saya menulis kelas pembuat string yang sangat cepat, implementasi enkripsi AES di ASM, dan seluruh pustaka FastCGI (www.coastrd.com)

Jadi seperti yang saya katakan, tidak sepele. Saya akan segera membuat perpustakaan ini tersedia. Jika Anda ingin memeriksanya, email saya.

Setelah komunikasi tertulis, Anda dapat mulai merancang sinkronisasi. Saya akan menggunakan hash untuk setiap catatan, atau flag boolean sederhana. Jika ada perubahan di server, cukup kirim seluruh catatan dan timpa di sisi klien (dengan asumsi Anda mencoba untuk menjaga agar klien tetap sinkron...)

Jika Anda menulis sendiri, silakan posting kembali di sini tentang pengalaman Anda!

PS. Pertimbangkan untuk mengubah judul agar lebih ramah penelusuran.. Mungkin seperti:

"Menyinkronkan database klien SQLite dengan database server MySQL"



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Apa cara terbaik untuk menyimpan gambar pengguna menggunakan PHP dan MySQL?

  2. Perbedaan kinerja Native SQL (menggunakan MySQL) vs menggunakan Hibernate ORM?

  3. Cara Mendapatkan Nama Bulan Pendek dari Tanggal di MySQL

  4. Memasukkan item ke dalam bootstrap-dropdown dari SQL Table

  5. Cara membaca parameter konfigurasi database menggunakan file properti di hibernate