Laden...

EF 6 - Wie kann ich bei Verbindungsverlust auf eine Fallback Database zurückgreifen?

Erstellt von manullino vor 5 Jahren Letzter Beitrag vor 5 Jahren 2.304 Views
manullino Themenstarter:in
371 Beiträge seit 2008
vor 5 Jahren
EF 6 - Wie kann ich bei Verbindungsverlust auf eine Fallback Database zurückgreifen?

verwendetes Datenbanksystem: <MSSQL>

Hallo zusammen,

falls EF die Verbindung zur Datenbank verliert, sollte ein Fallback Datenbank verwendet werden. Habt Ihr Erfahrungen wie das mit EF 6 umgesetzt werden kann?

Mir geht es nur um den Switch von DB1 zu DB2, dass die Daten dann noch synch. werden muessen, ist ein anderes Thema.

Vielen Dank,
Manullino

16.827 Beiträge seit 2008
vor 5 Jahren

Dafür gibt es keinen Automatismus in ADO.NET; egal ob EF genutzt wird oder nicht.
Exception abfangen und eine neue Connection aufbauen.

Es gibt nur den Parameter eines Failover Partners, das aber nur für die initiale Verbindung gilt.
Vor allem wird dadurch auch leider die MasterDB eine andere.

manullino Themenstarter:in
371 Beiträge seit 2008
vor 5 Jahren

Hallo Abt,

hab das nun recht simpel mit einem statischen Konstruktor im DBContext umgesetzt. Darin wir der SQL Server gepingt, klappt das nicht, wird der andere SQL Server verwendet.

Gruesse,
Manullino

T
2.222 Beiträge seit 2008
vor 5 Jahren

Wie genau sieht die Lösung aus?
Klingt nämlich nicht nach einer optimalen Lösung, da du durch den statischen Konstruktor nur einmalig diesen Fall prüfen kannst.
Besser wäre es aber bei jedem Verbindungsaufbau diesen Fall abzudecken.
Noch sinnvoller wäre aber eine Proxy Lösung, die dies übernimmt.
Dann müsstest du dich nur mit den Proxy verbinden und dieser liefert dir dann die Daten des jeweils aktiven Node.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

16.827 Beiträge seit 2008
vor 5 Jahren

hab das nun recht simpel mit einem statischen Konstruktor im DBContext umgesetzt. Darin wir der SQL Server gepingt, klappt das nicht, wird der andere SQL Server verwendet.

Das klingt nicht wirklich nach einer optimalen Lösung, das stinkt viel eher nach einem Gebastle, das zum Scheitern verurteilt ist. 😃

Wieso macht es nicht gleich richtig? 😉
Das kann ja so gar nicht wirklich stabil klappen.. das weisst doch selbst.

manullino Themenstarter:in
371 Beiträge seit 2008
vor 5 Jahren

Bisher gibt es keinerlei Probleme damit, bin aber offen fuer Vorschlaege! 😉


 public partial class MyContext : DbContext, IDBContext
    {
        public MyContext (bool isInServerMode) :
            base(GetConnectionString(isInServerMode))
        {
        }

        private static string GetConnectionString(bool isInServerMode)
        {
            string connectionStringName = "Server";
            string serverAdress = GetServerIP();

            if (!IsServerAvailable(serverAdress) || isInServerMode == false)
            {
                connectionStringName = "Local";
                Log(String.Format("Using {0} connection!", connectionStringName));
            }

            return String.Format("name={0}",connectionStringName);
        }
}

Gruesse,
Manullino

T
2.222 Beiträge seit 2008
vor 5 Jahren

Das ist aber kein statischer Konstruktor.
So hatte ich mir den Code auch eher vorgestellt.

Wie geschrieben, wäre es aber besser dies direkt per Proxy zu lösen, der dann den verfügbaren Server auswählt.
Sonst musst du für jeden DbContext den Code wiederverwenden oder ggf. in einer Basis Klasse den Code abbilden.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

manullino Themenstarter:in
371 Beiträge seit 2008
vor 5 Jahren

HI T-Virus,

vielen Dank fuer die Aufklaerung!
Nochmal kurz scharf nachgedacht, es ist eigentlich eine statische Methode im Konstruktor.

Ist in einer Base Class und in der Config.Web kann man die Connectionstrings festlegen. Fuer meinen Zweck ist das flexibel genung. 😉

Gruesse,
Manullino

F
26 Beiträge seit 2013
vor 5 Jahren

Hallo!

die "Proxy-Lösung" würde mich interessieren da ich über solch eine Problematik auch schon einmal nachgedacht habe. Ich kenne den Begriff "Proxy" jedoch nur aus dem Netzwerkbereich und kann leider in Verbindung mit der Programmierung hier nicht wirklich was anfangen (im Zusammenhang mit dem DB-Problem des TE).

Könntet ihr mir dies bitte im Detail erklären wie man so etwas auf die Beine stellt, bzw. vielleicht gibt es ja auch eine Artikel im Netz der das beschreibt. Ich weiß leider nicht genau wie ich danach suchen muss...

lg

T
2.222 Beiträge seit 2008
vor 5 Jahren

@fichz
Damit ist kein Proxy im Code gemeint.
Mit dem Gedanken aus der Netzwerktechnik liegst du da sogar richtig.
Dabei schaltet man sich nicht direkt auf den Ziel Server sondern eben auf einen Proxy.
Dieser schaut dann welcher der beiden Server innerhalb einer vorgegeben Zeitspanne antwortet und verbindet dich dann mit dem verfügbaren Server.
Somit muss man keinen Code umsetzen, der das Problem löst sondern lässt eine extra Softwaredie Verbindung zum Server durchreichen.

Bei PostgreSQL gibt es einige Proxies.
Bei MS SQL dürfte es auch entsprechende Tools geben.
Da ich dieses Szenario aber noch nicht hatte, kann ich nicht sagen welche Tools oder Möglichkeiten der SQL Server bietet.
Hier müsst ihr mal mit Google suchen oder vielleicht kennt jemand ein Tool.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

F
26 Beiträge seit 2013
vor 5 Jahren

Denke damit kann ich soweit schon mal was anfangen. Falls ich es mal benötige werde ich mich in die Materie einlesen.

Danke für die Erklärung!

lg