Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Mini
Člen
Avatar
Mini:4.10.2016 20:04

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.10.2016 20:04
Jste dobří jen v tom, co vás baví.
Avatar
Odpovídá na Mini
sadlomaslox25:4.10.2016 20:28

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

 
Nahoru Odpovědět
4.10.2016 20:28
Avatar
Mini
Člen
Avatar
Mini:4.10.2016 21:14

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.10.2016 21:14
Jste dobří jen v tom, co vás baví.
Avatar
Mini
Člen
Avatar
Odpovídá na Mini
Mini:4.10.2016 21:15

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.10.2016 21:15
Nahoru Odpovědět
4.10.2016 21:15
Jste dobří jen v tom, co vás baví.
Avatar
Odpovídá na Mini
Michal Štěpánek:4.10.2016 21:15

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

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

Nahoru Odpovědět
4.10.2016 21:21
Jste dobří jen v tom, co vás baví.
Avatar
Mini
Člen
Avatar
Mini:4.10.2016 21:30

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.10.2016 21:30
Jste dobří jen v tom, co vás baví.
Avatar
Odpovídá na Mini
Michal Štěpánek:5.10.2016 8:50

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.10.2016 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 Mini
sadlomaslox25:5.10.2016 20:45

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.10.2016 20:45
Avatar
Mini
Člen
Avatar
Mini:5.10.2016 22:19

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