NodeJS SQLite3数据库已被锁定

时间:2018-02-27 16:09:27

标签: javascript node.js sqlite

我收到错误'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)以使其更具可读性。

0 个答案:

没有答案