Tipps und Tricks rund um .NET und Visual Studio

.NET Framework: Abgebrochene Datenverbindungen automatisch wieder aufbauen
Keine Kommentare

Dr. Holger Schwichtenberg (MVP) und FH-Prof. Manfred Steyer teilen in der Kolumne „.NETversum“ ihr Expertenwissen rund um .NET-Tools und WPF mit. Dieses Mal zeigen sie, wie man in .NET Framework eine abgebrochene Datenverbindung mit ADO.NET Idle Connection Resiliency automatisch neu aufbauen kann.

Ein wesentliches neues Feature in .NET Framework 4.5.1 ist die Wiederaufnahme abgebrochener Datenbankverbindungen in ADO.NET. Bisher mussten sich Entwickler selbst darum kümmern, dass eine wegen fehlender Netzwerkverbindung, Load Balancing oder Failover auf Serverseite unterbrochene Datenbankverbindung wieder vom Client neu aufgebaut wird.

In .NET Framework 4.5.1 hat Microsoft dazu ein Feature namens „ADO.NET Connection Resiliency“ integriert, das dafür sorgt, dass im Fall des Abbruchs einer momentan ungenutzten Verbindung diese bei der nächsten Anforderung wieder aufgebaut wird, ohne dass im Programmcode dazu etwas zu tun ist. Von diesem Feature profitieren automatisch alle auf ADO.NET aufbauenden Datenzugriffsframeworks und objektrelationalen Mapper wie das Microsoft Entity Framework. Microsoft liefert diese Unterstützung für seinen Microsoft SQL Server 2014 und die Cloud-Variante SQL Azure. Andere Datenbankhersteller könnten diese Funktion aber auch einbauen.

Mit dem kleinen konsolenbasierten Testprogramm aus Listing 1 und dem Programm TCPView aus den Windows Systinternals kann man das Verhalten prüfen.

class Program
{
  static void Main(string[] args)
  {
   Console.WriteLine("Hauptprogramm Start");
   Console.WriteLine("-------------------------------------\n");
   Console.WriteLine(".NET-Version: " + System.Environment.Version);
   Console.WriteLine(".NET-Version: " + System.Runtime.InteropServices.RuntimeEnvironment.GetSystemVersion());
   Console.WriteLine("Installierte .NET-Version: " + Microsoft.Win32.Registry.GetValue(@"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full\", "Version", 0));
   Console.WriteLine("-------------------------------------\n");
   RunADONETIdleConnectionResiliency();

   Console.WriteLine("Fertig!");
   Console.ReadLine();
  }

static void RunADONETIdleConnectionResiliency()
  {
   var CS = @"Data Source=MeinServer.database.windows.net;Initial Catalog=ITVisions_db;Integrated Security=False;User ID=MeinAdmin;Password=MeinKennwort;Connect Timeout=60;Encrypt=False;TrustServerCertificate=False;"; // ConnectRetryCount=3; ConnectRetryInterval=10

   var Connection = new SqlConnection(CS);
   var SQL = "Select top(10) * from MeineTabelle";
   Connection.Open();

   for (int i = 1; i <= 10; i++)
   {
    Console.ForegroundColor = ConsoleColor.White;
    Console.WriteLine("{0}. Datenzugriff", i);
    Console.ResetColor();
    try
    {
     SqlCommand command = new SqlCommand(SQL, Connection);
     SqlDataReader reader = null;
     reader = command.ExecuteReader();
     Console.ForegroundColor = ConsoleColor.Green;
     Console.WriteLine("Erfolgreich: " + reader.HasRows);
     Console.ResetColor();
     reader.Close();

    }
    catch (Exception ex)
    {
     Console.ForegroundColor = ConsoleColor.Red;
     Console.WriteLine("Fehler: " + ex.Message);
     Console.ResetColor();
    }
    Console.WriteLine("Weiter?");
    var key = Console.ReadKey();
   }
}

Man startet zunächst das Testprogramm. Nach einem oder mehreren Datenzugriffen beendet man die offene Datenbankverbindung manuell mit TCPView über die Funktion „Close Connection“ (Abb. 1).

Abb. 1: Beenden der Verbindung

Abb. 1: Beenden der Verbindung

Unter .NET Framework 4.5 (intern 4.0.30319.18052) sieht man dann, dass die abgebrochene Verbindung zum Laufzeitfehler führt und auch nicht wieder neu aufgebaut werden kann. Die Verbindung gilt als geschlossen.

Unter .NET Framework 4.5.1 (intern 4.0.30319.18408) kommt es nicht zum Laufzeitfehler. Man sieht in TCPView, dass sich die Verbindung zur Datenbank automatisch wieder aufbaut.

Einfluss auf die ADO.NET Idle Connection Resiliency hat der Entwickler über die Einstellungen ConnectRetryCount (0 bis 255, im Standard 1) und ConnectRetryInterval (1 bis 60 Sekunden, im Standard 10) in einer Verbindungszeichenfolge. Diese Einstellungen sind allerdings nur unter .NET Framework 4.5.1 erlaubt. Unter .NET Framework 4.5 oder früheren Versionen führt die Nutzung einer solchen Verbindungszeichenfolge zum Laufzeitfehler. Daher sind sie im obigen Testprogramm auskommentiert.

Weiterhin kommt es aber auch unter .NET Framework 4.5.1 zum Laufzeitfehler in der Anwendung, wenn während einer laufenden Datenbankoperation ein Verbindungsabbruch geschieht. Das ist auch sinnvoll, da hier mannigfaltige Möglichkeiten existieren, je nachdem wie weit die Operation fortgeschritten ist und an welcher Stelle weiterzuarbeiten ist. Mit dieser Einschränkung auf ruhende Verbindungen erklärt sich auch, warum die neue Funktion das Wort „Idle“ im Namen trägt.

Windows Developer

Windows DeveloperDieser Artikel ist im Windows Developer erschienen. Windows Developer informiert umfassend und herstellerneutral über neue Trends und Möglichkeiten der Software- und Systementwicklung rund um Microsoft-Technologien.

Natürlich können Sie den Windows Developer über den entwickler.kiosk auch digital im Browser oder auf Ihren Android- und iOS-Devices lesen. Außerdem ist der Windows Developer weiterhin als Print-Magazin im Abonnement erhältlich.

Unsere Redaktion empfiehlt:

Relevante Beiträge

Abonnieren
Benachrichtige mich bei
guest
0 Comments
Inline Feedbacks
View all comments
X
- Gib Deinen Standort ein -
- or -