← Cloudflare D1 / d1 / best-practices
Opakování dotazů
Je vhodné zápisové dotazy z aplikace opakovat, pokud narazíte na dočasnou chyba. Ze seznamu D1_ERROR, podívejte se do sloupce Doporučená akce a zjistěte, zda by měl být dotaz opakován.
Příklad opakování dotazů
Zvažte následující příklad shouldRetry(...) funkce, převzaté z úvodní šablona pro replikaci pro čtení D1 ↗.
Ujistěte se, že vaše opakované pokusy používají strategii exponenciálního zpomalení s náhodnou odchylkou (jitter), díky čemuž budou úspěšnější.
Můžete použít knihovny, které to již řeší, například @cloudflare/actors ↗, nebo zkopírujte logiku opakování ↗ přímo ve vašem vlastním kódu.
import { tryWhile } from "@cloudflare/actors";
function queryD1Example(d1: D1Database, sql: string) {
return await tryWhile(async () => {
return await d1.prepare(sql).run();
}, shouldRetry);
}
function shouldRetry(err: unknown, nextAttempt: number) {
const errMsg = String(err);
const isRetryableError =
errMsg.includes("Network connection lost") ||
errMsg.includes("storage caused object to be reset") ||
errMsg.includes("reset because its code was updated");
if (nextAttempt <= 5 && isRetryableError) {
return true;
}
return false;
}