NodeJS Web服务器滞后

时间:2014-05-08 15:05:56

标签: node.js sqlite socket.io

1-2分钟后在覆盆子pi上运行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();

滞后消失了,所以这个功能出错了。

但它不起作用:

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;");

1 个答案:

答案 0 :(得分:2)

这是sqlite中一个非常常见的问题,已在FAQ中得到解答。有关详细信息,请查看https://www.sqlite.org/faq.html#q19。引用:

  

实际上,SQLite很容易在普通台式计算机上每秒执行50,000或更多INSERT语句。但它只会做一些   每秒十几笔交易。交易速度受到限制   磁盘驱动器的转速。交易通常需要   磁盘盘片的两个完整旋转,在7200RPM磁盘上   drive限制你每秒约60笔交易。

     

事务速度受磁盘驱动器速度的限制,因为(默认情况下)SQLite实际上等待数据确实安全存储   在事务完成之前在磁盘表面上。那样,如果   你突然断电或者你的操作系统崩溃,你的数据仍然存在   安全。有关详细信息,请阅读SQLite中的原子提交..

     

默认情况下,每个INSERT语句都是自己的事务。但是如果你用BEGIN ... COMMIT包围多个INSERT语句那么全部   插入数据被分组到一个事务中。需要的时间   提交事务在所有随附的插入中摊销   语句,因此每个插入语句的时间大大减少。

编辑:

要修复它,你要做的是在执行所有insert语句之前执行“BEGIN”和“COMMIT”。