Diskuze: Dvojte připojení do MySQL DB.

C# .NET .NET (C# a Visual Basic) Dvojte připojení do MySQL DB. American English version English version

Avatar
Merry
Člen
Avatar
Merry:

Ahoj,
Dělám si REST API ve webapi 2 a mám tam jeden problém.
V souboru WebApiConfig.cs sem si udělal Ticker, který mi každou sekundu kontroluje jeden atribut v tabulce, a když je nastaven tak něco spustim. (Logika je nepodstatná)
No a problém nastává tehdy, když mi ticker beží, a najednou hodim dotaz na tu mou API. Někdy to proběhne v pohodě a někdy to hodí chybu že Mysql už je piřpojen. Takže došlo k případu kdy sem přistupoval do DB a zároveň mi někdo přistoupil na APInu která hleděla do DB.
Chtěl jsem se zeptat jak se tohoto zbavit.
Použivám Timer.

var aTimer = new System.Timers.Timer(1000);
                aTimer.Elapsed += new ElapsedEventHandler(myFunction);
                aTimer.Interval = 1000;
                aTimer.Enabled = true;
                aTimer.Start();

Četl jsem že jede ve vlastním vlákně takže by se neměli křížit s hlavním vláknem.
Ale nevím jeslti je problém tam,
Všechny moje dotazy (db.select(), db.insert()...) mi začinají tím že davam db.open() a ve finally Disconnect().
Nevíte co s tím?
Díky moc :)

Odpovědět 4. října 20:04
Jste dobří jen v tom, co vás baví.
Avatar
Odpovídá na Merry
sadlomaslox25:

no chtelo by to videt tu "nepodstatnou" logiku v myFunction a z jake metody je volan ukazany kod.

 
Nahoru Odpovědět  +1 4. října 20:28
Avatar
Merry
Člen
Avatar
Merry:

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

Nahoru Odpovědět 4. října 21:14
Jste dobří jen v tom, co vás baví.
Avatar
Merry
Člen
Avatar
Odpovídá na Merry
Merry:

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í.

Editováno 4. října 21:15
Nahoru Odpovědět 4. října 21:15
Jste dobří jen v tom, co vás baví.
Avatar
Odpovídá na Merry
Michal Štěpánek:

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
Nahoru Odpovědět 4. října 21:15
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Merry
Člen
Avatar
Odpovídá na Michal Štěpánek
Merry:

v MySQL tento attribute neexistuje. Ale zkouším něco podobného najít.

Nahoru Odpovědět 4. října 21:21
Jste dobří jen v tom, co vás baví.
Avatar
Merry
Člen
Avatar
Merry:

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

Nahoru Odpovědět 4. října 21:30
Jste dobří jen v tom, co vás baví.
Avatar
Odpovídá na Merry
Michal Štěpánek:

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?

Nahoru Odpovědět 5. října 8:50
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Odpovídá na Merry
sadlomaslox25:

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(),Dis­connect() <contextSwitch>
a puvodni metoda pracuje nad disposnutym spojenim a puvodni spojeni je v memory leaku.

 
Nahoru Odpovědět 5. října 20:45
Avatar
Merry
Člen
Avatar
Merry:

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 :-)

Nahoru Odpovědět  +1 5. října 22:19
Jste dobří jen v tom, co vás baví.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 10.