关于 generic-pool 连接mongodb中的一个问题!
我从网上看到的(我用这个连接mongodb,发现不太好用,你们有遇到么?):
generc-pool小巧精悍,总共只有几百行,完全由js代码写成。使用的方法页很简单。但是有一点不足的地方是,实例A和实例B建立链接,初始化连接池poolAB之后,如果实例A在守护进程的作用下进行了重启,此时poolAB中的所有连接都会失效,但是generic-pool本身只对超时的连接进行了处理,对于这种虽然没有超时但是已经失效的连接并没有相应操作。这个缺陷为我的工作带来了极大困扰。我对该模块进行了小小的改动,实现了对失效链接的处理。
其实就添加了一个函数:
function removeNotWritable() {
var toKeep = [],
i,
al;
// Go through the available (idle) items,
// check if they are not writeable
for (i = 0, al = availableObjects.length; i < al; i += 1) {
if (availableObjects[i]["obj"]["writable"] != false && availableObjects[i]["obj"]["readable"] != false ) {
// Client is writeable, so keep it.
toKeep.push(availableObjects[i]);
} else {
// The client is not writeable, call it's destroyer.
// log("removeIdle() destroying obj - now:" + now + "not writeable");
me.destroy(availableObjects[i].obj);
}
}
// Replace the available items with the ones to keep.
availableObjects = toKeep;
al = availableObjects.le`n`gth;
}
这个函数遍历了连接池中所有现存的连接句柄,判断是否可读可写,若不可以,则证明该连接失效,删除此连接。在dispense()函数的如下位置调用该函数即可实现对失效连接的销毁。
function dispense() {
......
if (waitingCount > 0) {
removeNotWritable();
if (availableObjects.length > 0) { .....................