1

我正在使用以下代码连接 CouchBase

couchbase.connect(config.CouchBaseConnector, function (err, CouchBaseDB) {
    if (err) {
        throw (err)
    }
    CouchBaseDB.set(keyPush, docPush, function (err, meta) {
        if (err) { console.log(err); }
    });
  }

但是它创建了多个连接。

有人可以帮我解决这个问题。基本上我想做一些像连接池这样的事情并继续重复使用。


我遇到了来自CouchBase的一个文档。但无法弄清楚它是如何工作的以及在 Windows 7 64 位版本上部署它的步骤。
更新
我认为moxi-server目前还没有针对 Windows 操作系统发布。

4

3 回答 3

2

Couchbase 节点 SDK 本身就是一个连接池。它负责管理与集群的连接,在服务器拓扑结构发生任何变化时收到警报(添加/删除/失败的节点)

这就是为什么大多数时候您将代码放在全局回调方法中并重用连接的原因

var express = require('express'),
driver = require('couchbase'),
routes = require('./routes');

dbConfiguration = {
"hosts": ["my-couchbase-server:8091"],
"bucket": "bucket"
}

driver.connect(dbConfiguration, function(err, cb) {
    if (err) {
        throw (err)
    }
    // put your application logic here
});

如果要使用全局变量,则需要等待回调并确保在使用之前建立了连接。

于 2013-05-23T08:14:51.180 回答
0

我发现以下代码对我有用。请任何人有更好的解决方案,请发布,我总是欢迎。

GLOBAL.CouchBaseDBConnection = undefined;
function OpenCouchBase(callback) {
    if (CouchBaseDBConnection == undefined) {
        couchbase.connect(config.CouchBaseConnector, function (err, couchbaseOpenCon) {
            if (err)
                return console.log("Failed to connect to the CouchBase");
            else {
                CouchBaseDBConnection = couchbaseOpenCon
                callback(null, couchbaseOpenCon);
            }
        });
    }
    else { callback(null, CouchBaseDBConnection); }
};
module.exports.OpenPoolCouchBase = OpenCouchBase;
于 2013-05-17T10:42:43.847 回答
0

您可以为 Node 使用通用资源池模块:node-pool

它是通用池,因此您可以根据需要对其进行调整。

编辑:

这是示例代码:

var poolModule = require('generic-pool');
var pool = poolModule.Pool({
    name     : 'couch',
    create   : function(callback) {
       couchbase.connect(config.CouchBaseConnector, function (err, couchbaseOpenCon) {
            if (err)
                return console.log("Failed to connect to the CouchBase");
            else {
                CouchBaseDBConnection = couchbaseOpenCon
                callback(null, couchbaseOpenCon);
            }
        });
    },
    destroy  : function(client) { client.end(); },
    max      : 10,
    // specifies how long a resource can stay idle in pool before being removed
    idleTimeoutMillis : 30000,
     // if true, logs via console.log - can also be a function
    log : true 
});

// acquire connection - callback function is called once a resource becomes available
pool.acquire(function(err, client) {
    if (err) {
        // handle error - this is generally the err from your
        // factory.create function  
    }
    else {
        console.log("do whatever you want with the client ...");
        pool.release(client);
        });
    }
});
于 2013-05-16T15:35:35.293 回答