关于 generic-pool 连接mongodb中的一个问题!
发布于 2年前 作者 bao2dan 853 次浏览

我从网上看到的(我用这个连接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) { .....................
回到顶部