我收到错误'SQLite_BUSY:数据库被锁定'很多次。 这不是因为我用另一个程序打开了数据库。我认为这是因为我尝试在数据库之后添加太多行。这会使应用程序每天多次崩溃。
我不太了解数据库和sqlite,所以可能有更好的方法来做到这一点。但对我来说这似乎没问题(ish)。
让我解释一下。我有这个±1000-1500项的JSON文件,我想检查该行的每一项。我试图从数据库中获取该项目,如果没有发生,我知道它以前没有在这里;我将它添加到数据库,并在Discord频道中发送消息。如果该项目之前已经在这里(因此已在数据库中找到),则不会发生任何事情。每次调用该函数时,将添加5-50个项目。
我发现没有关闭数据库(参见下面的//)使得它不那么频繁发生。所以我决定不关闭它。可能不是处理事情的好方法,但这似乎更好。但是偶尔会发生'SQLITE_BUSY:数据库被锁定'。
所以我的问题是:我怎样才能改进这一点'数据库被锁定'不会发生。有什么我应该做的不同,还是有一个完整的其他方法会更好地工作?
function sendFiltered(jsonObjects, channel_id){
if(jsonObjects != null){
const sqlite3 = require("sqlite3").verbose();
let db = new sqlite3.Database('./database.db', (err) => {
if(err) {
return console.error(err.message);
}
});
jsonObjects.forEach((item) => {
db.serialize(function() {
db.get("SELECT * FROM items WHERE encounterId = ?", [item.encounter_id], (err, row) => {
if (err) {
return console.error(err.message);
}
if(row == undefined){
request({
url: "https://maps.googleapis.com/maps/api/geocode/json?latlng=" + item.lat + "," + item.lon + "&key=KEY",
json: true
}, function (error, response, body) {
let embed = new Discord.RichEmbed()
.setTitle(item.name + ' ' + item.id)
.setThumbnail("attachment://" + getThumb(item.id) + ".png");
const files = [{
attachment: 'img/items/' + getThumb(item.id) + '.png',
name: getThumb(item.id) + '.png'
}];
db.run("INSERT INTO items (encounterId) VALUES (?)", [item.encounter_id]);
client.channels.get(channel_id).send(item.name + ' ' + 'level ' + item.level, {embed, files});
});
} else {
console.log('Already send in channel');
}
});
});
});
// db.close((err) => {
// if(err) {
// return console.error(err.message);
// }
// });
}
}
我删除了一些不必要的代码(Discord RichEmbed)以使其更具可读性。