[phpBB Debug] PHP Warning: in file [ROOT]/includes/session.php on line 214: htmlspecialchars(): charset `g' not supported, assuming utf-8
[phpBB Debug] PHP Warning: in file [ROOT]/includes/session.php on line 215: htmlspecialchars(): charset `g' not supported, assuming utf-8
[phpBB Debug] PHP Warning: in file [ROOT]/includes/session.php on line 216: htmlspecialchars(): charset `g' not supported, assuming utf-8
[phpBB Debug] PHP Warning: in file [ROOT]/includes/session.php on line 87: htmlspecialchars(): charset `g' not supported, assuming utf-8
[phpBB Debug] PHP Warning: in file [ROOT]/includes/session.php on line 129: htmlspecialchars(): charset `g' not supported, assuming utf-8
[phpBB Debug] PHP Warning: in file [ROOT]/includes/session.php on line 130: htmlspecialchars(): charset `g' not supported, assuming utf-8
[phpBB Debug] PHP Warning: in file [ROOT]/includes/session.php on line 1685: htmlspecialchars(): charset `g' not supported, assuming utf-8
PROMOTIC FORUM • View topic - PmADO reconnect

PmADO reconnect

Toto je hlavní technické fórum pro diskusi o problémech při vytváření PROMOTIC aplikací a jejich řešení.

PmADO reconnect

Postby LiborD » Tue 07. May 2024 19:51:00

Dobrý den,

připojuji se k databázi pomocí objektu PmADO. Konkrétně se jedná o MySQL.

Potřebuji vyřešit situaci, kdy je databáze nedostupná. Resp. situaci, kdy při zapnutí PRM dojde k připojení DB, ale ta se za nějaký čas vypne (např. z důvodu údržby). Následně opět za nějaký časový úsek naskočí. Je požadováno pokračovat dále.

Zjistil jsem, že DbIsOpen() nedokáže reagovat na aktuální situaci. Správnou hodnotu zobrazí při prvotním spuštění (mám zatrženo připojovat při spuštění aplikace). Viz. stavy:

1. Start PRM, zapnutá DB => DbIsOpen() == 1
2. Start PRM, vypnutá DB => DbIsOpen() == 0
3. Start PRM, zapnutá DB, následné vypnutí DB => DbIsOpen() == 1

Poradíte mi prosím, jak udělat správně reconnect k DB?

Mimo jiné právě díky nesrpávnému vyhodnocení připojení k DB mě aplikace spadne na dotaz do DB.

Předpokládal jsem, že si vystačím s tímto:
Code: Select all
//// test připojenosti DB MySQL + případný connect
if (MySQL.DbIsOpen() == 0){
   MySQL_ok = false;
   var b = MySQL_ok.DbOpen;
} else {
   MySQL_ok = true;
}


Děkuji.
LiborD
 
Posts: 9
Joined: Tue 07. May 2024 19:35:16

Re: PmADO reconnect

Postby Tomáš Bräuer » Wed 22. May 2024 12:58:16

Dobrý den,
bohužel ADO connection (PmaAdo) zůstává otevřený, i když se ztratí net spojení nebo se vzdálená DB zastaví. Toto dělá i MSSQL nejenom MySQL. Takže v trendech do MSSQL dělám automatický reopen při zápisu trendů tak, že pokud selže operace čtení nebo zápisu s určitým číslem chyby (to se SQL databázi od databáze liší), potom volám se zpožděním opakovaně zadanou operaci několikrát. Nakonec provedu interně na ADO explicitně Close a nový Open, u vás zřejmě DbClose a DbOpen.

Chybové kódy ADO operací (DbOpen a DbExecute v objektu PmMap hodnoty Result a ErrorCode) je třeba testovat viz https://www.promotic.eu/cz/pmdoc/Object ... DbOpen.htm

Pokud se s databází dělá jenom občas, lze spojení udržovat zavřené a otevřít si to na konkrétní operaci s databází a zase po sobě zavřít. Ale běžnější je nechat databázi otevřenou a testovat výsledek jednotlivých operací.
Tomáš Bräuer
Administrátor
 
Posts: 168
Joined: Thu 13. Dec 2012 9:13:13

Re: PmADO reconnect

Postby LiborD » Wed 22. May 2024 13:42:19

Děkuji za reakci.

Problém je ten, že aplikace např. při SELECT Promotic spadne "not responding".

Lze nějakým způsobem docílit, že Promotic "nespadne"? Koukal jsem, že v Dodatečných parametrech připojení k datbázi lze vyplnit následující:
connectiontimeout:3;commandtimeout:3; Např. update si kontroluji pomocí PmMap, ale to nejsem schopen zajistit, když při dotazu přestane aplikace pracovat... Zkoušel jsem i samotné volání dát do Sequenceru.

2024.05.22 14:34:22.292 ERROR: Count:1 Ident:PmAdo('/MySQL').RsOpen: 2003 - [MySQL][ODBC 8.2(w) Driver]Can't connect to MySQL server on 'localhost:3306' (10061) Note:(PmaTimer: /Select, Event: onTick)
2024.05.22 14:34:22.292 ERROR: Count:1 Ident:PmAdo('/MySQL').RsOpen: 0 - Nespecifikovaná chyba Note:(PmaTimer: /Select, Event: onTick)
2024.05.22 14:34:22.306 ERROR: Count:1 Ident:PmAdo('/MySQL').RsOpen: 2013 - [MySQL][ODBC 8.2(w) Driver][mysqld-5.5.5-10.4.32-MariaDB]Lost connection to MySQL server during query Note:(PmaTimer: /Select, Event: onTick)

Komunikuji s externím serverem a občas je výpadek internetu což způsobí právě to odpojení a já tuto situaci nejsem schopen nijak ošetřit.

Zasílám i app.

Děkuji.
Attachments
Test DB.zip
(18.15 KiB) Downloaded 2145 times
LiborD
 
Posts: 9
Joined: Tue 07. May 2024 19:35:16

Re: PmADO reconnect

Postby LiborD » Mon 17. Jun 2024 12:26:06

Dobrý den,

mohl bych poprosit o reakci. Blíží se mě termín spuštění aplikace produkce...

Děkuji.

S pozdravem
Libor Dočekal, TMT
LiborD
 
Posts: 9
Joined: Tue 07. May 2024 19:35:16

Re: PmADO reconnect

Postby Tomáš Bräuer » Mon 17. Jun 2024 12:45:41

Dobrý den,
nevím co poradit. Pokud se přistupuje k synchronně externím zdrojům (soubory, databáze), je zde doporučovaná možnost provádět dotaz v jiném vlákně pomocí PmaSequencer objektu.
Takto to dělají alarmy, eventy a trendy interně.

U sekvencéru je třeba mít na paměti, že kód v události onStep je v jiném vlákně, ale nesmíte z toho onStep volat žádnou uživatelskou metodu jiného objektu než PmaSequencer. Tzn můžete volat pMe.Methods.Xxx(a,b,c) , ale už nemůžete volat například pMe.Pm("/JinyObjekt").Methods.Yyy(a,b,c), protože cizí metoda je volána opět v hlavním vlákně.
V pracovním vlákně sekvencéru je pouze událost onStep a metody v pMe.Methods .
Jedná se o složitý problém, založit aplikaci na SQL dotazech v externí databázi na nestabilní síti.
Určitě je lehčí mít DB lokálně nebo 100% spolehlivou síť.
Nebo udělat replikaci vzdálené databáze na lokální a nechat synchronizaci na DB, třeba si s nestabilní síti poradí lépe.

Pokud oddělení přístupu v aplikaci do jiného vlákna nepomůže, lze také rozdělit aplikaci na 2 aplikace, přičemž pomocná aplikace by se starala o SQL.
Opravdu nevím co jinak poradit.
Tomáš Bräuer
Administrátor
 
Posts: 168
Joined: Thu 13. Dec 2012 9:13:13

Re: PmADO reconnect

Postby LiborD » Thu 11. Jul 2024 8:59:27

Prozatím jsem z toho vybruslil případným restartem PC, který je vyvolán PmRtManagerem v případě přerušení spojení s aplikací.

Chtěl bych se zeptat na ten sequencer. To co jste napsal o tom, že nemohu volat jinou metodu (resp. v jiném objektu než samotný seq) pokud chci zachovat nové vlákno ("nevstoupit" do hlavního). Platí to tedy i pro objekt PmAdo?

Úvaha, že v události OnStep v seq zavolám příkaz s externím objektem PmAdo a budu schopen ho na timeout ukončit (pokud se neprovede např. z důvodu selhání připojení k DB) je tedy mylný?

Code: Select all
var MySQL = pMe.Pm("../MySQL");
var oRs_EAN = MySQL.RsOpen("", "SELECT * FROM tasks;", "");


Děkuji.
LiborD
 
Posts: 9
Joined: Tue 07. May 2024 19:35:16

Re: PmADO reconnect

Postby Tomáš Bräuer » Fri 12. Jul 2024 7:14:59

Dobrý den,
otázku jsem přesně nepochopil, ale zdůrazňoval jsem UŽIVATELSKOU metodu. To znamená vaši metodu v JavaScript nebo VBScript v záložce Metody. Ta bude v jiných objektech skutečně vyvolána v hlavním vlákně. Ale naše implementační metody objektu (RsOpen, DbOpen, Pm.IniFileRead, atd.) ty se vykonávají ve vlákně volajícího, nedochází k přepnutí vlákna.
V praxi to dnes děláme tak, že do objektu sekvencér se přesunou všechny nutné uživatelské metody i z jiných objektů v zájmu zachování vlákna.

Například u PmaAdo naše předkonfigurace vytvoří i několik uživatelský metod a my je dneska tvoříme i v sekvencéru pro asynchronní volání ADO uživatelské metody se synchronní implementaci v sekvencéru v novém vlákně. Tím se odlehčí hlavnímu vláknu a vlastní uživatelská metoda zůstane sekvenční synchronní. Cenou je přenesení uživatelských metod do sekvencéru.
Tomáš Bräuer
Administrátor
 
Posts: 168
Joined: Thu 13. Dec 2012 9:13:13

Re: PmADO reconnect

Postby LiborD » Mon 19. Aug 2024 8:55:38

Dobrý den,

ošetřeno takto:

Code: Select all

// Připojit se k DB a provést operace
var MySQL = pMe.Pm("../../MySQL")
var MSSQL = pMe.Pm("../../MSSQL");
var MSSQL_ok;
var MySQL_ok;

// pokud není připojeno, tak připojím DB MSSQL
if (! MSSQL.DbIsOpen()){
   var b = MSSQL.DbOpen();
}

// test připojenosti DB MSSQL
if (! MSSQL.DbIsOpen()){
   MSSQL_ok = false;
} else {
   MSSQL_ok = true;
}

// test připojenosti DB MySQL
if (! MySQL.DbIsOpen()){
   MySQL_ok = false;
} else {
   MySQL_ok = true;
}

// Kontrola, zdali jsou obě databáze úspěšně připojeny
if (MSSQL_ok == true && MySQL_ok == true){

pMe.Pm(".").Methods.OrdersParse()
pMe.Pm(".").Methods.OrdersResult()

} else {
Pm.InfoLogAdd("OrdersParse", "Nepřipojeno k DB");
}


// Ukončení připojení
MSSQL.DbClose();


seq nastaven:
položky se spouští postupně
Normal - nové vlákno normální priority
timeout 4s

dodatečné parametry v PmADO:
connectiontimeout:2;commandtimeout:3;

Mysql je lokální a tam jsem připojen po celou dobu běhu aplikace. MSSQL je externí.

Myslíte, že je to takto v pořádku či by jste ještě doporučil nějakou změnu?

Pozn. všiml jsem si, že se mi vypisuje samovolně volání metody do Pm.Debug, viz. obr. Je možné toto odstranit?

Děkuji.
Attachments
pmdebug.png
pmdebug.png (40.6 KiB) Viewed 30060 times
LiborD
 
Posts: 9
Joined: Tue 07. May 2024 19:35:16

Re: PmADO reconnect

Postby Tomáš Bräuer » Mon 19. Aug 2024 9:32:30

Dobrý den,
výpis do INFO/Debug je bohužel můj zapomenutý výpis, který bude odstraněn v další verzi, která bude příští týden. Vy nemáte možnost jej ovlivnit.

K vlastnímu kódu nic nemám, důležité, jestli jste našel způsob, který vyhovuje.
Jenom čisté formalismy ke kódu (nejsou to chyby):
pMe.Pm(".") vrací pMe,
takže
pMe.Pm(".").Methods.OrdersParse() nahraďte pMe.Methods.OrdersParse();
a chybí vám tam na konci středníky, to může vést k nepříjemným chybám.

Boolean se v if netestuje na if (a == true) to nemusí vždy platit, bezpečnější a rychlejší je psát if (a) a negaci jako if (!a)
Tomáš Bräuer
Administrátor
 
Posts: 168
Joined: Thu 13. Dec 2012 9:13:13


Return to Nevím jak...

Who is online

Users browsing this forum: No registered users and 7 guests

cron