Knex: Verbindungsstatus

Erstellt am 30. Juli 2014  ·  7Kommentare  ·  Quelle: knex/knex

Weiß jemand wie man den Verbindungsstatus bekommt? Ich möchte einen Fehler ausgeben, wenn der Datenbankserver nicht erreichbar ist.

Hilfreichster Kommentar

Gibt es hierzu Neuigkeiten? Ich kann die Fehler von Knex nicht abfangen, nachdem ich in der Initialisierungsfunktion keine Verbindung zur DB hergestellt habe, ich sehe nur die protokollierten Fehler

Knex:Error Pool2 - Error: connect ECONNREFUSED
Knex:Error Pool2 - Error: connect ECONNREFUSED

aber ich möchte eine Rückruffunktion, mit der ich diesen Fehler abfangen und benachrichtigt werden kann, dass die DB-Verbindung fehlgeschlagen ist.

Alle 7 Kommentare

Hier gilt das gleiche.
Nimmt der Initialisierer einen Rückruf an?

knex verwendet einen Verbindungspool . Abfragen geben eine abgelehnte Zusage zurück, wenn eine Verbindung nicht aus dem Pool abgerufen werden kann. Im Moment gibt es keine einfache Möglichkeit festzustellen, ob der Datenbankserver erreichbar ist.

Danke für die Antwort.
Scheint eine notwendige Funktion zu sein. Vielleicht für eine zukünftige Version?
Wie würde das aussehen?

require('knex')(db_config, function(e){ }) ist ein gängiges Muster.

Oder knex.on('disconnect', function(e){ })

Nur spucken, falls andere auf das gleiche Problem stoßen und eine Lösung hinzufügen möchten.

Funktioniert aber nicht so. Wikipedia hat einen schönen Eintrag zum Verbindungspooling . Der Pool „erwärmt“ sich bis zu einer bestimmten Mindestanzahl von Objekten basierend auf dem gelieferten Minimum. Wenn Sie dies aus irgendeinem Grund im Voraus wissen müssen, können Sie einfach eine Testabfrage ausführen. Dies ist der Ansatz, den Sequelize verwendet FWIW (https://github.com/sequelize/sequelize/blob/9b7d9ae34bb813a4a094754a066ae98a8ac10853/lib/sequelize.js#L654-L658)

Sie führen im Grunde eine Dummy-Abfrage aus und prüfen, ob es funktioniert hat. Ich denke nicht, dass es sinnvoll ist, es in die API aufzunehmen, aber so würde es aussehen, wenn Sie es in Ihren Anwendungen implementieren möchten:

knex.raw('select 1+1 as result').then(function () {
  // there is a valid connection in the pool
});

@bendrucker guter select 1 as dbIsUp vereinfacht werden. Ich glaube jedoch, dass Strategie allein nicht tragfähig ist. Wenn Sie eine App starten und eine Verbindung zur DB herstellen und dann die DB stoppen, während die App ausgeführt wird, bleiben viele Abfragen hängen, während der Pool herausfindet, dass WTF stattfindet. Sie müssen die Fehler auf Verbindungsebene abfangen, wenn Sie gute App-Antworten wünschen, auch wenn die Datenbank gerade ausgefallen ist und Abfragen hängen bleiben und die Verbindungen beginnen, Fehler auszugeben.

Ich habe immer noch keinen umfassenden Ansatz, aber im Moment kann ich meine App über DB-Bounce- und Server-Fehlerseiten am Laufen halten, aber es gibt immer noch Randfälle, bei denen ich nicht herausgefunden habe, wie ich sie wirklich polieren kann.

Gibt es hierzu Neuigkeiten? Ich kann die Fehler von Knex nicht abfangen, nachdem ich in der Initialisierungsfunktion keine Verbindung zur DB hergestellt habe, ich sehe nur die protokollierten Fehler

Knex:Error Pool2 - Error: connect ECONNREFUSED
Knex:Error Pool2 - Error: connect ECONNREFUSED

aber ich möchte eine Rückruffunktion, mit der ich diesen Fehler abfangen und benachrichtigt werden kann, dass die DB-Verbindung fehlgeschlagen ist.

Hoffe das hilft

import knex from "knex"
import config from "../../knexfile"

export async function connectDB(retries = 5) {
    while (retries) {
        try {
            await knex(config[process.env.NODE_ENV]).raw("select 1+1 as result")
                        break
        } catch (error) {
            console.error("Couldn't connect to DB: ", error)

            retries -= 1
            console.log(`retries left: ${retries}`)

            // wait 5 seconds
            await new Promise(res => setTimeout(res, 5000))
        }
    }
}
War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

ghost picture ghost  ·  3Kommentare

marianomerlo picture marianomerlo  ·  3Kommentare

lanceschi picture lanceschi  ·  3Kommentare

aj0strow picture aj0strow  ·  3Kommentare

mattgrande picture mattgrande  ·  3Kommentare