Diskuze: Dvojte připojení do MySQL DB.
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Člen
Zobrazeno 10 zpráv z 10.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
no chtelo by to videt tu "nepodstatnou" logiku v myFunction a z jake metody je volan ukazany kod.
Tady se volá každou sekundu moje funkce
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
var aTimer = new System.Timers.Timer(1000);
aTimer.Elapsed += new ElapsedEventHandler(myFunction);
aTimer.Interval = 1000;
aTimer.Enabled = true;
aTimer.Start();
}
}
A daná funkce je tady:
Database database = new Database();
List<Dictionary<string, string>> selectResult = database.Select("finish_auction", new string[] {
"ID","item" }, "", new object[] { }, "", 0);
která mi vrací seznam záznamů.
A tady je metoda Select
public List<Dictionary<string, string>> Select(string table, string[] attributes, string condition, object[] arguments, string orderBy, int count)
{
try
{
Connect();
MySqlDataReader reader = command.ExecuteReader();
...
}
....
finally
{
Disconnect();
}
Posílám to zkráceně. Opravdu je zde logika naprosto nepodstatná k danému problému
Proste se tento Select zavolá ve stejnou dobu vícekrát. Jednou z normálního dotazu na REST API, a po druhé z toho tickeru. A to mu asi vadí.
Nevím, jak to funguje s MySQL, ale když jsem se do podobného problému dostal s MS SQL, tak mi pomohlo do ConnectionStringu přidat
MultipleActiveResultSets=true
v MySQL tento attribute neexistuje. Ale zkouším něco podobného najít.
Ted jsem se dočetl že když vytvořím nové připojení na MySQL tak by to
mělo být v pohodě.
Jenomže ja ho vytvářím na zacatku kazdého dotazu metodou Connect().
string constr = ConfigurationManager.ConnectionStrings["constr"].ConnectionString;
connection = new MySqlConnection(constr);
command = new MySqlCommand();
command.Connection = connection;
connection.Open();
Takže opravdu nevím kde by mohl být problém
Ano, nové připojení jo, ale když jsem tak pročítal web, všude se píše, že MySQL prostě nepodporuje mít dvě "připojení" otevřená najednou... Máš nějaký důvod používat právě MySQL a ne MSSQL?
z kodu je evidentni ze "connection" je instancni promena. problem je ze to,
ze neni vubec nijak synchronizovana:
uzivatel klikne na tlacitko
spusti se metoda Connect() <contextSwitch>
trigne se casovac Connect(),Disconnect() <contextSwitch>
a puvodni metoda pracuje nad disposnutym spojenim a puvodni spojeni je v memory
leaku.
Problém byl v tom že opravdu MySQL tohle nepodporuje.
Vyřešil jsem to tak ze jsem vytvořil novou instanci připojení. Takže nový
connection string v configu a dal jsem mu jiné jméno. Tohle řešení se mi
ale vůbec nelíbí tak přecházím na MSSQ, které tohle podporuje.
Každopádně díky moc
Zobrazeno 10 zpráv z 10.