我有一個 Nodejs 專案,它涉及一個 sqlite 資料庫(better-sqlite3),它將各種物體及其之間的關系存盤在幾個表中。在設定的時間表上(我使用節點時間表),代碼中的一個作業將被啟動,該作業使用外部 HTTP API 并根據需要進行任何更新,這可能需要相當長的時間。此外,當我們通過 API 檢測到發生影響特定物體的某些更改時,一些更頻繁但較小的更新作業將按計劃進行。
我想避免在更新正在進行時運行這些查詢函式,因為它可能正在處理部分資料。
我正在尋找能夠向查詢函式指示更新正在進行中的最佳方法,并且他們應該等待更新完成或至少跳過該運行。使用“承諾鏈”很容易,并在資料庫更新后進行查詢,但我不想在每次需要查詢時都更新資料庫。
時間或速度并不是真正的問題。以下是最初構建它的步驟,偶爾會有一個類似的大更新。
我不確定是否使用一些“標志”并有辦法等待它,或者更確切地說,在更新完成之前暫停所有其他活動是最有意義的。這是我使用過的最多的 JavaScript,但對術語和最佳實踐并不太熟悉。
async function buildDatabase() {
db.exec('CREATE TABLE IF NOT EXISTS VMS (name TEXT, id TEXT, environment TEXT, ait TEXT)');
db.exec('CREATE TABLE IF NOT EXISTS HYPERVISORS (name TEXT, id TEXT, environment TEXT)');
db.exec('CREATE TABLE IF NOT EXISTS HOSTING (vm TEXT, hypervisor TEXT)');
let hypervisors = await api.getEntities(test_config, 'type("HYPERVISOR")')
hypervisors.forEach(function(hypervisor) {
const insertStmt = db.prepare("INSERT INTO HYPERVISORS VALUES (?, ?, ?)")
insertStmt.run(hypervisor.displayName, hypervisor.entityId, test_config.host)
})
hypervisors.forEach(async function(hypervisor) {
let running_vms = await api.getCurrentVMs(test_config, hypervisor.entityId)
running_vms.forEach((vm) => {
const insertStmt = db.prepare("INSERT INTO HOSTING VALUES (?, ?)");
insertStmt.run(vm, hypervisor.entityId);
})
})
let vms = await api.getEntities(test_config, 'type("HOST"),hypervisorType("VMWARE")');
vms.forEach((vm) => {
let ait_tag_value = "missing";
for (const tag of vm.tags) {
if (tag.key === AIT_TAG_KEY) {
ait_tag_value = tag.value;
break;
}
}
const insertStmt = db.prepare("INSERT INTO VMS VALUES (?, ?, ?, ?)");
insertStmt.run(vm.displayName, vm.entityId, test_config.host, ait_tag_value);
})
}
buildDatabase().then(() => {
let stmt = db.prepare('SELECT * FROM HYPERVISORS');
let hvs = stmt.all();
// console.log(hvs)
}).then(() => {
let stmt = db.prepare('SELECT * FROM VMS');
let vms = stmt.all();
console.log(vms)
}).then(() => {
let stmt = db.prepare('SELECT * FROM HOSTING');
let mappings = stmt.all();
// console.log(mappings)
})
謝謝!
uj5u.com熱心網友回復:
最簡單的事情是,無論更新是否正在進行,您都可以只維護一個標志(例如布爾變數),而其他代碼可以根據需要檢查該標志。您只需要確保您的更新代碼是防彈的,并且即使在所有可能的錯誤情況下,它也會始終清除該標志。
該標志可以直接在同一模塊中使用,也可以通過isUpdateInProgress()僅回傳布林值的匯出函式使用。
在更優雅的版本中,您可以匯出一個函式,例如該函式getUpdate()將回傳一個承諾,該承諾將在更新進行時掛起,并在更新完成時解決。這樣,其他一些任務實際上可以使用該承諾等到更新完成后再做一些事情。
如果您試圖在其他代碼正在使用資料庫時防止更新代碼開始,那么這有點復雜。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/487594.html
標籤:javascript 节点.js 数据库 sqlite axios
上一篇:洗掉垂直網格線并防止高度調整
