verwendetes Datenbanksystem: SQL Server
Hallo ich spiele gerade mit SQL Dependency herum und habe das Beispiel von MS dazu verwendet:
An sich funktioniert das, aber ich probiere gerade ein wenig aus und wenn ich viele Inserts in kurzer Zeit mache, werden nur max. zwei davon registriert.
*EDIT* Wenn ich das Console.Writeline mit dem neu abbonieren tausche, werden bis zu 20 Einträge registriert. Ist das abbonieren vielleicht zu langsam?**
Das kann doch kein erwünschtes Verhalten sein oder? Ich führe folgendes SQL 180 hintereinander aus:
insert into t3_auftr_log_ll (lade_nr, vg_lfd_nr, status) values(1,2,3)
und habe das Beispiel so bearbeitet das noch eine Connection zur Datenbank geöffnet wird und jedes mal beim Event der Event Handler neu abonniert wird:
class Program
{
private string sampleConnectionString = "Server=DESKTOP-N943R2B\\SQLEXPRESS01;Database = DBDependency; User Id = sa;Password = admin; ";
SqlConnection conn;
public static void Main(string[] args)
{
var program = new Program();
program.Initialization();
Console.ReadLine();
}
void Initialization()
{
// Create a dependency connection.
conn = new SqlConnection(sampleConnectionString);
RegisterDependencyUsingSpecificQueue();
}
private void RegisterDependencyUsingSpecificQueue()
{
if (conn.State == ConnectionState.Closed)
{
conn.Open();
}
SqlDependency.Start(sampleConnectionString);
using (SqlCommand command = new SqlCommand("SELECT [id],[lade_nr],[vg_lfd_nr],[status] FROM[dbo].[t3_auftr_log_ll]", conn))
{
// Create a dependency and associate it with the SqlCommand.
SqlDependency dependency = new SqlDependency(command);
// Maintain the reference in a class member.
// Subscribe to the SqlDependency event.
dependency.OnChange += new OnChangeEventHandler(OnDependencyChange);
// Execute the command.
using (SqlDataReader reader = command.ExecuteReader())
{
// Process the DataReader.
}
}
}
// Handler method
void OnDependencyChange(object sender, SqlNotificationEventArgs e)
{
Console.WriteLine("Got Here!");
// Handle the event (for example, invalidate this cache entry).
RegisterDependencyUsingSpecificQueue();
}
void Termination()
{
// Release the dependency.
SqlDependency.Stop(sampleConnectionString, "SQLDependencyQueue");
}
}
Ohne das neu abbonieren geht es nur einmal. Ich kann mir nicht erklären wieso das gerade so ist. Hat da jemand vielleicht eine Idee?
Habs herausgefunden, die SQLDependency registriert keine weiteren Notifications solange der Handler noch am arbeiten ist. Das ganze ist für so eine Anzahl an Daten schon bereits nicht gut verwendbar wenn man alle Datensätze haben will.
Was anstatt dessen aber geht ist SqlNotificationRequest
Beispiel hier: SQLNotificationRequest
Persönlich getestet und funktioniert gut auch mit über 100 Inserts in der Sekunde.