Pertanyaan Monitor sisipan MySQL dari aplikasi yang berbeda


Saat ini saya memiliki webservice yang menyisipkan informasi dalam database mysql menggunakan Hibernate. Beberapa informasi ini perlu diproses oleh aplikasi 'impor' yang lain. Saya tidak ingin memicu aplikasi ini dari jejaring. Jadi jejaring tidak memiliki ketergantungan pada jejaring dan sebaliknya.

Apakah ada cara untuk "mendengarkan" perubahan (khususnya: menyisipkan) dalam database dari aplikasi 'impor' dan kemudian mulai menjalankan suatu tindakan. Saya telah melihat pemicu tetapi ini tampaknya hanya bekerja untuk perubahan dalam sesi Hibernate aplikasi dan bukan untuk perubahan 'eksternal'.

Sunting *

Singkatnya, jawaban yang ingin saya miliki; Apakah mungkin untuk memantau perubahan ke database / tabel mysql (berasal dari sumber apa saja) dari aplikasi java yang tidak mengubah database / tabel itu sendiri

Pembaruan Kuasa *

Saya akan memberikan penghargaan kepada orang yang dapat menjelaskan kepada saya bagaimana memonitor perubahan yang dilakukan pada tabel / database MySQL menggunakan aplikasi Java. Aplikasi Java yang memantau perubahan bukanlah aplikasi yang menerapkan perubahan apa pun. Sumber perubahannya bisa apa saja.


10
2017-07-12 18:18


asal


Jawaban:


Kamu bisa membaca mysql log biner. Di sini Anda dapat menemukan beberapa informasi. Ada sebuah parser java dan yang lainnya - tetapi ditandai sebagai belum selesai) juga Anda dapat mencari parser serupa menggunakan bahasa lain (misalnya, perl) dan menulis ulang mereka di Java.
Juga lihatlah mysql-proxy.


5
2017-07-14 19:03



Saya pikir Anda bisa mencapai sesuatu seperti ini dengan mudah, dengan asumsi Anda tidak keberatan membuat beberapa tabel tambahan & pemicu pada database Anda, dan bahwa aplikasi java pemantauan harus polling database daripada khusus menerima pemicu.

Dengan asumsi tabel yang ingin Anda pantau adalah sesuatu seperti ini:

CREATE TABLE ToMonitor ( id INTEGER PRIMARY KEY, value TEXT );

Kemudian Anda membuat tabel untuk melacak perubahan, dan pemicu yang mengisi tabel itu:

CREATE TABLE InsertedRecords( value TEXT );
CREATE TRIGGER trig AFTER INSERT ON account
FOR EACH ROW INSERT INTO InsertedRecords( value ) VALUES ( NEW.value );

Ini akan menyebabkan tabel InsertedRecords akan diisi dengan setiap insert yang terjadi di ToMonitor.

Maka Anda hanya perlu mengatur aplikasi pemantauan Anda secara berkala SELECT * from InsertedRecords, ambil tindakan yang tepat dan kemudian bersihkan catatan dari InsertedRecords

EDIT: Sedikit alternatif, jika Anda tidak keberatan sedikit C / C + + coding, akan menjadi ikuti instruksi di sini untuk membuat fungsi SQL kustom yang memicu aplikasi pemantauan Anda ke dalam tindakan, dan kemudian panggil saja fungsi SQL dari dalam pemicu yang Anda buat.


11
2017-07-14 19:25



Saya tahu itu bukan apa yang Anda minta (dengan demikian, ini bukan jawaban yang tepat), tetapi jika Anda mempertimbangkan menjatuhkan ide "membiarkan DB memberitahukan aplikasi", Anda mendapatkan kasus sempurna untuk menggunakan JMS untuk komunikasi antar aplikasi.

Aplikasi Anda yang berasal dari perubahan dapat memublikasikan pesan ke topik JMS, yang dilanggan oleh aplikasi kedua. Setelah perubahan pertama database, itu menempatkan pesan pada topik. Yang kedua kemudian melihat peristiwa baru ini dan bertindak sesuai dengan itu. Anda bahkan bisa mempublikasikan delta dalam pesan, sehingga aplikasi kedua tidak perlu mencapai database.

Saya agak menentang menangani ini dengan "meretas" basis data untuk melakukan lebih dari sekadar menyimpan data, karena itu tidak akan pernah mendapat masalah di masa depan (karena semuanya pada akhirnya akan), dan debugging itu akan sulit. Bayangkan menambahkan aplikasi ketiga ekosistem, dan Anda sekarang harus meniru apa pun yang Anda lakukan untuk aplikasi kedua, tetapi sekarang untuk aplikasi ketiga. Jika Anda tidak mendokumentasikan langkah Anda, Anda mungkin tersesat.

Jika Anda hanya menggunakan server JMS di antara kedua aplikasi tersebut, Anda pasti dapat menambahkan aplikasi ketiga di masa mendatang, yang hanya mendengarkan topik ini (dan mempublikasikan pesan baru, jika ada akses tulis ke db), dan yang lainnya aplikasi bahkan tidak perlu tahu bahwa ada satu aplikasi lagi di luar sana. Juga basis data.


3
2017-07-17 08:12



asumsikan kita ingin memantau perubahan dalam tabel 'table1'

CREATE TABLE `table1` (
    `id` INT(10) NOT NULL AUTO_INCREMENT,
    `value` VARCHAR(50) NULL DEFAULT NULL,
    PRIMARY KEY (`id`)
)
COLLATE='latin1_swedish_ci'
ENGINE=InnoDB
AUTO_INCREMENT=10;

di atas adalah kueri untuk membuat 'tabel1' berisi kolom 'id' yang merupakan kenaikan otomatis

buat tabel lain untuk menyimpan perubahan. Pertanyaan diberikan di bawah ini

CREATE TABLE `changes` (
    `id` INT(10) NOT NULL AUTO_INCREMENT,
    `changes` VARCHAR(200) NULL DEFAULT '0',
    `change_time` TIMESTAMP NULL DEFAULT NULL,
    `tablename` VARCHAR(50) NULL DEFAULT NULL,
    `changed_id` VARCHAR(10) NULL DEFAULT NULL,
    PRIMARY KEY (`id`)
)
COLLATE='latin1_swedish_ci'
ENGINE=InnoDB
AUTO_INCREMENT=21;

sekarang buat pemicu di tabel pertama yaitu .. 'table1' Query diberikan di bawah ini

delimiter |
create trigger trg_table1 AFTER INSERT ON table1
FOR EACH ROW BEGIN
DECLARE lastid INT DEFAULT 0;
SELECT max(id) INTO lastid from table1;
insert into changes values(null,'insert',now(),'table1',lastid);
end;
|
delimiter ;

Sekarang jika Anda mencoba memasukkan apa pun di 'table1', detailnya akan secara otomatis dimasukkan ke dalam tabel perubahan.  Dalam perubahan perubahan tabel menunjukkan jenis perubahan yaitu .. masukkan, perbarui dll                   change_time menunjukkan waktu saat perubahan terjadi                   tablename menunjukkan tabel di mana perubahan terjadi                   changed_id menunjukkan id dari baris yang baru dimasukkan di 'table1'

Sekarang buat program java yang terus membaca dari tabel 'perubahan'. Entri baru di tabel 'perubahan' berarti terjadi sesuatu pada basis data. Dari setiap catatan di tabel 'perubahan' Anda dapat memahami di mana tabel operasi insert terjadi. Dan berdasarkan ini Anda dapat melakukan tindakan yang tepat. Setelah melakukan operasi yang sesuai, hapus baris itu dari tabel 'perubahan'.

Anda dapat membuat pemicu (seperti yang saya lakukan di atas) untuk setiap tabel dalam database Anda ... Dari kolom 'tablename' tabel 'perubahan' Anda dapat memahami sisipan yang terjadi di tabel mana ..


3
2017-07-17 14:33



Anda bisa menggunakan solusi antrian seperti Q4M, tetapi mungkin berlebihan dalam situasi Anda. Tetapi Anda bisa:

Di database MySQL, tambahkan kolom timestamp ke tabel yang sedang dimasukkan ke dalamnya. Dalam aplikasi 'impor', gunakan java.util.timer, atau penjadwal eksternal seperti cron. Gunakan salah satu dari mereka untuk memicu tugas yang membaca tabel sisipan di mana kolom timestamp adalah nol. Ambil tindakan yang sesuai untuk baris tersebut, lalu setel kolom timestamp dengan nilai. Jika tidak ada baris dengan stempel waktu nol, Anda tidak memiliki sisipan baru. Sederhana, tetapi berhasil.

Anda mungkin ingin menambahkan indeks ke kolom timestamp untuk alasan kinerja.


2
2017-07-14 19:37