Pertanyaan Alternatif untuk dependensi sq


Saya memiliki tabel mssql yang menyimpan informasi obrolan. Ini telah menghitung kolom, memiliki jutaan baris dan sedang digunakan / dihuni oleh aplikasi pihak ketiga. Sekarang saya ingin menggunakan tabel ini untuk menampilkan riwayat obrolan di situs web saya dan mungkin di masa depan memiliki kemampuan untuk mengirim pesan menggunakan signalr. Saya melakukan beberapa tes menggunakan sqldependency dan itu bekerja tetapi hanya untuk pertanyaan spesifik yang tidak akan membantu dalam kasus saya (saya harus mengecualikan kolom yang dihitung, tidak dapat memesan dengan pesan terakhir, tidak dapat mengatur 100 pesan teratas, dll)

Jadi pertanyaan saya adalah apa yang akan menjadi alternatif? menggunakan jejaring yang meng-poll database setiap x detik?

Catatan samping, saya tidak memiliki pengaruh di atas meja sama sekali.


5
2018-05-07 15:10


asal


Jawaban:


Saya pikir Anda masih bisa menggunakannya SqlDependency jika Anda berpikir lebih banyak tentang kebutuhan Anda yang sebenarnya.

Kueri yang Anda gunakan untuk mendeteksi perubahan tidak harus sama dengan yang Anda gunakan mengambil perubahan. Jadi, Anda bisa

select id from chat where chatRoomId = 123

sebagai "mendeteksi perubahan permintaan". Ini hanya akan memberitahu Anda "Ada pesan baru. Atau lebih.", Tidak ada yang lain. Kemudian, untuk mendapatkan baris baru yang sebenarnya, Anda dapat menggunakan kueri rumit Anda:

select 
 top 100 someComplexColumn, everythingElse 
from chat 
where chatRoomId = 123 
order by messageTime desc

Selama "mendeteksi perubahan permintaan" cukup baik untuk memisahkan sebagian besar perubahan yang tidak Anda pedulikan dari perubahan yang Anda lakukan melakukan peduli, kamu baik-baik saja. Ingat, SqlDependency tidak benar-benar memberitahumu apa diubah, atau apa pun tentang data. Tidak peduli berapa banyak data yang cocok dengan kueri sekarang - hanya melacak perubahan yang sesuai dengan filter yang Anda tentukan. Dan karena pesan obrolan biasanya tidak dapat diubah, Anda dapat lolos hanya dengan memeriksa id kolom (misalnya "item baru"). Jika pesan obrolan Anda dapat diedit, Anda juga harus menambahkan beberapa changedOn kolom ke "mendeteksi perubahan permintaan" Anda.


6
2018-05-07 15:15



Alternatif yang bagus untuk SqlDependency aku s SqlDependencyEx. Itu tidak memiliki kebocoran memori masalah dan menggunakan pemicu basis data ditambah pemberitahuan Layanan Broker asli untuk menerima acara tentang perubahan tabel. Ini adalah contoh penggunaan:

int changesReceived = 0;
using (SqlDependencyEx sqlDependency = new SqlDependencyEx(
          TEST_CONNECTION_STRING, TEST_DATABASE_NAME, TEST_TABLE_NAME)) 
{
    sqlDependency.TableChanged += (o, e) => changesReceived++;
    sqlDependency.Start();

    // Make table changes.
    MakeTableInsertDeleteChanges(changesCount);

    // Wait a little bit to receive all changes.
    Thread.Sleep(1000);
}

Assert.AreEqual(changesCount, changesReceived);

Dengan SqlDependecyEx Anda dapat memantau INSERT, DELETE, UPDATE secara terpisah dan menerima data yang berubah aktual (xml) dalam hal args objek. Memfilter pesan masuk membantu Anda menerapkan perilaku yang diinginkan. Semoga bantuan ini.


1
2018-05-14 08:34