Start · Sprachen · JavaScript · Referenz · IDBDatabase.close()

IDBDatabase.close()

Methode

Schließt die Verbindung zu einer IndexedDB-Datenbank. Die Methode kehrt sofort zurück, die Verbindung wird erst geschlossen, wenn alle laufenden Transaktionen abgeschlossen sind.

seit JavaScript Baseline: alle Browser (IndexedDB 1.0) Kategorie: webapi

Signatur

IDBDatabase.prototype.close()

Beschreibung

close() beendet eine offene Verbindung zu einer IndexedDB-Datenbank, die du vorher mit indexedDB.open() geöffnet hast. Der Aufruf kehrt sofort zurück. Die Verbindung wird aber erst dann wirklich geschlossen, wenn alle Transaktionen fertig sind, die über diese Verbindung gestartet wurden. Neue Transaktionen kannst du ab dem Aufruf nicht mehr starten: transaction() wirft dann eine InvalidStateError-DOMException.

Wichtig ist das vor allem bei Versionswechseln. Wenn ein anderer Tab die Datenbank mit einer höheren Versionsnummer öffnet, bekommen alle bestehenden Verbindungen das Ereignis versionchange. Solange diese Verbindungen offen bleiben, wird das Upgrade blockiert und im anderen Tab feuert blocked. Die übliche Lösung: Im onversionchange-Handler db.close() aufrufen.

Genauso brauchst du close(), bevor du eine Datenbank mit indexedDB.deleteDatabase() löschst. Solange noch eine Verbindung offen ist, wird das Löschen blockiert. In Tests und kurzlebigen Hilfsfunktionen solltest du Verbindungen ebenfalls bewusst schließen, damit keine Ressourcen offen bleiben.

Anders als bei einer Schließung durch den Browser (z. B. beim Löschen der Speicherdaten durch den Nutzer) feuert bei einem manuellen close() kein close-Ereignis.

Rückgabewert

Typ
void
Beschreibung
Kein Rückgabewert (undefined). Die Methode bietet weder ein Promise noch einen Callback, mit dem du erfährst, wann die Verbindung tatsächlich geschlossen ist.

Beispiele

Datenbank öffnen, Daten schreiben, Verbindung schließen

const openDB = (name, version) => new Promise((resolve, reject) => {
  const req = indexedDB.open(name, version);
  req.onupgradeneeded = () => {
    req.result.createObjectStore('notizen', { keyPath: 'id' });
  };
  req.onsuccess = () => resolve(req.result);
  req.onerror = () => reject(req.error);
});

const speichereNotiz = async (notiz) => {
  const db = await openDB('app-db', 1);
  const tx = db.transaction('notizen', 'readwrite');
  tx.objectStore('notizen').put(notiz);
  // close() darf direkt folgen: Die laufende Transaktion wird noch abgeschlossen
  db.close();
  await new Promise((resolve, reject) => {
    tx.oncomplete = resolve;
    tx.onerror = () => reject(tx.error);
  });
  console.log('Notiz gespeichert, Verbindung geschlossen');
};

speichereNotiz({ id: 1, text: 'Einkaufen' });
Notiz gespeichert, Verbindung geschlossen

Bei versionchange schließen, damit andere Tabs upgraden können

const req = indexedDB.open('app-db', 1);

req.onsuccess = () => {
  const db = req.result;
  db.onversionchange = (event) => {
    console.log(`Neue Version ${event.newVersion} angefordert – schließe Verbindung`);
    db.close();
    // Optional: Nutzer bitten, die Seite neu zu laden
  };
};
Neue Version 2 angefordert – schließe Verbindung

Nach close() sind keine neuen Transaktionen möglich

const req = indexedDB.open('app-db', 1);
req.onupgradeneeded = () => req.result.createObjectStore('notizen', { keyPath: 'id' });
req.onsuccess = () => {
  const db = req.result;
  db.close();
  try {
    db.transaction('notizen', 'readonly');
  } catch (err) {
    console.log(err.name);
  }
};
InvalidStateError

Verbindung vor dem Löschen der Datenbank schließen

const loescheDatenbank = (db) => new Promise((resolve, reject) => {
  db.close(); // sonst wird deleteDatabase blockiert
  const req = indexedDB.deleteDatabase(db.name);
  req.onsuccess = () => resolve('gelöscht');
  req.onerror = () => reject(req.error);
  req.onblocked = () => console.warn('Noch offene Verbindungen in anderen Tabs');
});

const req = indexedDB.open('temp-db', 1);
req.onsuccess = async () => {
  console.log(await loescheDatenbank(req.result));
};
gelöscht

// Wichtig · Fallstricke

  • Asynchrone Schließung: close() kehrt sofort zurück. Die Verbindung ist aber erst zu, wenn alle laufenden Transaktionen fertig sind. Ob das geklappt hat, erfährst du nicht direkt: Es gibt weder ein Promise noch ein Ereignis dafür.
  • Kein close-Ereignis: Das Ereignis close feuert nur, wenn die Verbindung unerwartet geschlossen wird (z. B. weil Speicherdaten gelöscht wurden), nicht bei einem manuellen close().
  • InvalidStateError: Nach dem Aufruf wirft db.transaction() eine InvalidStateError. Verbindungen, die schon geschlossen sind, lassen sich nicht wieder öffnen. Dafür brauchst du einen neuen indexedDB.open()-Aufruf.
  • Blockierte Upgrades: Wenn du versionchange nicht behandelst, bleiben Versions-Upgrades in anderen Tabs hängen (blocked-Ereignis). Reagiere darauf in jeder Anwendung mit db.close().
  • Einen Fehler wirft close() nicht, auch nicht bei wiederholtem Aufruf.
  • Kompatibilität: Die Methode wird von allen modernen Browsern unterstützt und ist auch in Web Workern verfügbar.