NodeJS网页服务器滞后

1-2分钟后。 在树莓派上运行web服务器,我得到滞后。 我使用nodeJS,socket.io和sqlite数据库。 我怀疑这个:

io.sockets.on('connection', function(socket){ setInterval(function(){ fs.readFile('/sys/bus/w1/devices/'+ tempId +'/w1_slave', function(error, buffer){ // Read data from file (using fast node ASCII encoding). var data = buffer.toString('ascii').split(" "); // Split by space // Extract temperature from string and divide by 1000 to give celsius var temp = parseFloat(data[data.length-1].split("=")[1])/1000.0; // Round to one decimal place temp = Math.round(temp * 10) / 10; // Add date/time to temperature var data = { temp_irasai:[{ laikas: Date.now()+10800000, laipsnis: temp }]}; socket.emit('realtime', data); var statement = db.prepare("INSERT INTO temp_irasai VALUES (?, ?)"); statement.run(data.temp_irasai[0].laikas, data.temp_irasai[0].laipsnis); statement.finalize(); }); }, 8000); }); 

那么我评论这一行:

 var statement = db.prepare("INSERT INTO temp_irasai VALUES (?, ?)"); statement.run(data.temp_irasai[0].laikas, data.temp_irasai[0].laipsnis); statement.finalize(); 

滞后了,所以这个function是错误的。

但它不工作:

 db.run("BEGIN TRANSACTION;"); var statement = db.prepare("INSERT INTO temp_irasai VALUES (?, ?);"); statement.run(data.temp_irasai[0].laikas, data.temp_irasai[0].laipsnis); statement.finalize(); db.run("commit;"); 

这是在常见问题解答中已经回答的sqlite中的一个非常常见的问题。 看看https://www.sqlite.org/faq.html#q19了解更多详情。 如引用:

实际上,SQLite在一台普通的桌面计算机上每秒钟很容易做到5万或更多的INSERT语句。 但是每秒只能做几十个交易。 交易速度受到磁盘驱动器转速的限制。 一个事务通常需要磁盘的两个完整的旋转,在7200RPM的磁盘驱动器上,每秒钟约有60个事务。

事务速度受磁盘驱动器速度的限制,因为(默认情况下)SQLite实际上一直等到数据真正安全存储在磁盘表面上,然后事务完成。 那样的话,如果你突然失去电源,或者你的操作系统崩溃,你的数据仍然是安全的。 有关详细信息,请阅读SQLite中的primefaces提交。

默认情况下,每个INSERT语句都是它自己的事务。 但是,如果使用BEGIN … COMMIT包围多个INSERT语句,则所有插入操作都会分组到一个事务中。 提交事务所需的时间将在所有随附的插入语句之间进行摊销,因此每个插入语句的时间大大减less。

编辑:

为了解决这个问题,你想要做的是在所有的插入语句执行之后执行“BEGIN”和“COMMIT”。