NEWS
SQL.Adpter: Insert-Befehle innerhalb von 40ms
-
@nettekov sagte in SQL.Adpter: Insert-Befehle innerhalb von 40ms:
Wenn zwei SQL-Statements in einer Transaktion auftauchen, dann kommt auch der Syntax-Error.
Eventuell kann @apollon77 was dazu sagen?
-
@nettekov sagte in SQL.Adpter: Insert-Befehle innerhalb von 40ms:
@marc-berg Vielen dank für deine Antwort.
Weiß Du , wofür die V1.16.1 steht.
Bevor ich den SQL-Adapter , deinstalliere und wieder installiere, sollten wir erst wissen, wofür Diese Version steht.Ich weiß es nicht, vielleicht es nur ein Anzeigefehler. Genauso gut kann ein Update unvollständig durchgelaufen sein. Ich finde es aber verdächtig, und eine Neuinstallation eines Adapters ist keine Raketentechnologie.
-
Hallo zusammen,
ich versuche es mit diesen Code-Schnipsel, das Problem provisorisch zu umgehen. Dient nur zu Testzwecken.
adapter.log.error(`Hallo Welt --> ${query}`); var start=0; var ende=0; var schleife=true; var sub_query=query; do{ start=query.indexOf("INSERT",ende); ende=query.indexOf(";INSERT",start); if (ende<0){ ende=query.length ; schleife=false; } else{ ende++; schleife=true; } sub_query=query.substring(start,ende); client.execute(sub_query, (err /* , rows, fields */) => { if (err) { adapter.log.error(`Cannot insert ${query}: ${err} (id: ${id})`); } else { checkRetention(id); } cb && cb(); // BF asked (2021.12.14): may be return here err? }); }while(schleife); returnClientToPool(client);
(Achtung! Kopieren und Einsetzen auf eigene Gefahr! Dies ist nicht mit dem Entwickler abgesprochen und dient nur zur Testzwecken. Ich nehme keinerlei Gewähr!)
Momentan sieht es gut aus, es gibt keine Fehlermeldung mehr, wenn zwei INSERT in einer Transaktion stehen, bzw die Werte werden auch gespeichert.
Gruss nettekov
-
@nettekov sagte in SQL.Adpter: Insert-Befehle innerhalb von 40ms:
In der main.js werden mit dieser Funktion die Datenlogs gesendet?
sorry für die verspätung, aber ich glaube du hast es selbst schon herausgefunden.
ja, das ist die funktion, welche für die inserts zuständig ist.
mit client.execute wird der befehl ausgeführt und wenn ein fehler kommt, wird die query (so wie es der adapter erzeugt hat) ausgegeben + die db fehlermeldung + die betroffene id -
@haus-automatisierung Also Wenn da wirklich in einem SQL Statement vom Adapter zwei Queries gesendet werden zusammen dann muss ich schauen warum - weil ich entsinne mich das die SQL Lib das nicht kann .... aber da muss ich reinschauen. Github issue bitte anlegen
-
-
@apollon77
@haus-automatisierung
Hallo zusammen,ich wollte mal ein Status nach 3 Tagen abgeben. Wenn ich irgendwie helfen kann, gebt mir bitte Bescheid.
ich bekommen ca 5-20 mal in der Stunde , SQL-Sequenzen mit mehrfach INSERT-Statements von den Aquara Sensoren.
Beispiel aus den Logs:sql.0 15.02.2023 19:54 info Hallo Welt -->(SUB)adapter.log.error INSERT INTO `iobroker`.ts_counter (id, ts, val) VALUES (47, 1676485989164, 5.77),(47, 1676486828459, 5.26);INSERT INTO `iobroker`.ts_number (id, ts, val, ack, _from, q) VALUES (47, 1676486828459, 5.26, 1, 2, 0); sql.0 15.02.2023 19:34 info Hallo Welt -->(SUB)adapter.log.error INSERT INTO `iobroker`.ts_counter (id, ts, val) VALUES (47, 1676484472310, 6.11),(47, 1676485989164, 5.77);INSERT INTO `iobroker`.ts_number (id, ts, val, ack, _from, q) VALUES (47, 1676485989164, 5.77, 1, 2, 0); sql.0 15.02.2023 19:54 info Hallo Welt -->(SUB)adapter.log.error INSERT INTO `iobroker`.ts_counter (id, ts, val) VALUES (50, 1676483202748, 19.83),(50, 1676486821479, 19.78),(50, 1676486821479, 19.78),(50, 1676487143779, 19.72);INSERT INTO `iobroker`.ts_number (id, ts, val, ack, _from, q) VALUES (50, 1676486821479, 19.78, 1, 2, 0),(50, 1676487143779, 19.72, 1, 2, 0); ..............
Durch den temporären, eingebauten Codeschnipsel in der '_InsertValueIntoDB' - Funktion werden alle eingehenden mehrfach INSERT-Statement in einzelne INSERT-Sequenz separiert und als einzelne Transaktionen verschickt.
Bis jetzt habe ich keine Fehlermeldung mehr erhalten, bzw. die Daten werden ohne Probleme gespeichert.Wie gesagt, dies ist nur temporär bis das Problem gefixt ist.
Gruss nettekov(Achtung! Kopieren und Einsetzen auf eigene Gefahr! Dies ist nicht mit dem Entwickler abgesprochen und dient nur zur Testzwecken. Ich nehme keinerlei Gewähr!)
function _insertValueIntoDB(query, id, cb) { adapter.log.debug(query); borrowClientFromPool((err, client) => { if (err) { returnClientToPool(client); adapter.log.error(err); cb && cb(); // BF asked (2021.12.14): may be return here err? } else { //BEGIN******************************************** //adapter.log.info(`Hallo Welt --> ${query}`); var start=0; var ende=0; var schleife=true; var sub_query=query; do{ start=query.indexOf("INSERT",ende); ende=query.indexOf(";INSERT",start); if (ende<0){ ende=query.length ; schleife=false; } else{ ende++; schleife=true; adapter.log.info(`Hallo Welt -->(SUB)adapter.log.error ${query}`); } sub_query=query.substring(start,ende); client.execute(sub_query, (err /* , rows, fields */) => { if (err) { adapter.log.error(`Cannot insert ${query}: ${err} (id: ${id})`); } else { checkRetention(id); } cb && cb(); // BF asked (2021.12.14): may be return here err? }); }while(schleife); returnClientToPool(client); //ENDE****************************************************** /* client.execute(query, (err ) => { returnClientToPool(client); if (err) { adapter.log.error(`Cannot insert ${query}: ${err} (id: ${id})`); } else { checkRetention(id); } cb && cb(); // BF asked (2021.12.14): may be return here err? });*/ } }); }
-
@nettekov sagte in SQL.Adpter: Insert-Befehle innerhalb von 40ms:
Durch den temporären, eingebauten Codeschnipsel in der '_InsertValueIntoDB' - Funktion werden alle eingehenden mehrfach INSERT-Statement in einzelne INSERT-Sequenz separiert und als einzelne Transaktionen verschickt.
Die Frage ist ja eher, wie die da rein kommen.
OT: Schau dir mal die String-Funktion split an
-
@haus-automatisierung said in SQL.Adpter: Insert-Befehle innerhalb von 40ms:
Die Frage ist ja eher, wie die da rein kommen.
Die kommen durch die Aqara Sensoren für Temperatur, Luftdruck und Luftfeuchtigkeit.
Ich hatte letztes Jahr im Januar 3 Stück gekauft und bis dato keine Probleme.
Im Januar zwei weitere implementiert. Erst in der Kombination diesen zwei gab es die Probleme, dann aber z. T. von allen fünf.
Von den anderen Zigbee-Teilnehmern, bzw. Datenpunkten ist alles ruhig.
Vielleicht haben wir hier ein Chargen Problem bei den Aqara.
Würde zumindest erklären, warum das Problem jetzt auftritt.Ich habe noch einen Sensor übrig, denn kann ich gerne zuschicken.
Grüße nettekov
-
@haus-automatisierung said in SQL.Adpter: Insert-Befehle innerhalb von 40ms:
OT: Schau dir mal die String-Funktion split an
Jaja, ich ziehe mir den
gerne an.
Beim nächsten Flickschustern nehme ich die Zange statt nicht den Hammer. -
@nettekov @haus-automatisierung ALso wo er herkommt weiss ich ... und ist "schon ewig" so ... ich denke eher das das counter Feature nicht so oft genutzt wird (und nicht vom testing), sodass das einfach noch nie wirklich aufgefallen ist.
Sauber müsste man umbauen das die "insert" Methode in den DB-Function Files (mysql.js, mssql.js ...) keinen String sondern ein array zurückgibt und dann wie bei der abarbeitung von SQLFunct.init oder .destroy das von der Methode allScripts() gemacht wird weil die das array dann "kommandoweise" abarbeitet. Ich schaue mal wann ich neben Matter zeit finde das zu machen, aber ja dein workkaround tut auch erstmal für dich