我已经设置了一个节点服务器来保存日志信息。预计会有非常大量的请求进入。我正在使用 mongo 数据存储,但它的性能太不可靠了。读取事物报告方面的数据通常需要异常长的时间。所以我改用经典的mysql。如果您准备批量插入而不是单例插入,那么显然有显着的写入吞吐量优势。于是我找到了这个人:
https://gist.github.com/3078520
我喜欢它的简单。它只有几行,非常强大。它有两个主要功能add()
,将记录添加到队列中,然后flush()
在队列达到一定大小时调用。然后它将flush()
队列加入一个长字符串并创建一个长的批量插入语句,然后将其发送到 mysql 驱动程序(我从提供的链接简化了函数:
this.flush = function () {
/*1*/ var sql = queryTemplate.replace('{values}', '\n('+ queue.join('),\n(') +')');
/*2*/ handle.query(sql, callback);
/*3*/ queue = [];
}
这本质上是一个类函数,它是请求处理程序拥有的单个类实例的一部分。所以我的问题是,这安全吗?是queue
一个类变量。当flush()
被调用时,它处理队列。我能看到的唯一问题是如果flush()
被调用,则执行第 1 行以生成 sql 语句(只是一个字符串),然后调用add()
另一个queue
向query()
. 在这种情况下,第二个进程添加的记录将丢失,因为第一个进程在创建 sql 语句时不知道它,并且在清除queue
. 这可能吗?
这个问题的更一般化的形式如下。一旦一个函数开始执行,其他任何外部因素都会影响其范围之外的变量吗?这是一个非常简单的示例,假设不同的请求调用这两个函数,是否可以在此示例中执行 console.log:
var global_number;
function a(){
global_number=2;
}
function b(){
global_number=1;
if(global_number==2){
console.log("a() influenced global_number in the middle of b()'s execution")
}
}
这主要是一个是/否的问题,但我正在寻找更多。一个简短的解释或指向我可以了解更多信息的页面的链接会很棒!谢谢!