Nodejs BAE MongoDB 连接断开问题

Nodejs BAE MongoDB 连接断开问题

Hi各位,请教下这个问题,太头疼了 在BAE搭建的NodeJS项目,用mongoose连接BAE提供的MongoDB服务器,打印日志看了下每30秒就掉.网上查了下是BAE不支持长连接,一段时间没操作的话空闲连接就会关闭 试了N种方法:

  1. 写了个timer一直请求数据库,完全没用.timer设置为10S请求一次,但是数据库连接还是每30S报错一次. 2.捕捉connection的error事件, 在error事件触发的时候关闭再重新打开连接. 刚开始管用,运行一段时间站点就无法响应了.连上面的timer都不会执行了…

有谁也遇到过这个问题?有什么好的解决方案么?


5 回复

Node.js BAE MongoDB 连接断开问题

背景

在使用百度应用引擎(BAE)部署的Node.js项目中,通过Mongoose连接到BAE提供的MongoDB服务器时,发现每隔30秒连接就会断开。经过调查发现,BAE平台不支持长连接,长时间没有操作会导致空闲连接被关闭。

已尝试的方法

  1. 定时器请求数据库

    • 尝试通过定时器每10秒向数据库发送一次请求,期望保持连接不断开。
    • 示例代码:
      const mongoose = require('mongoose');
      
      mongoose.connect('mongodb://your_connection_string', { useNewUrlParser: true, useUnifiedTopology: true });
      
      setInterval(() => {
        mongoose.connection.db.admin().command({ ping: 1 });
      }, 10000);
      
    • 结果:虽然定时器可以定期发送请求,但连接仍然会在30秒后断开。
  2. 捕捉connectionerror事件

    • 捕捉到连接错误后,关闭当前连接并重新建立新的连接。
    • 示例代码:
      mongoose.connection.on('error', (err) => {
        console.error(`Database connection error: ${err.message}`);
        mongoose.disconnect();
        mongoose.connect('mongodb://your_connection_string', { useNewUrlParser: true, useUnifiedTopology: true });
      });
      
    • 结果:这种方法起初有效,但运行一段时间后,整个站点变得无响应,甚至定时器也无法执行。

解决方案

考虑到BAE平台的限制,一个更可靠的解决方案是使用keepAlive配置项来维持连接。keepAlive可以让MongoDB客户端在连接断开时自动重连。

  • 示例代码:
    mongoose.connect('mongodb://your_connection_string', {
      useNewUrlParser: true,
      useUnifiedTopology: true,
      keepAlive: 30000, // 设置keepAlive时间为30秒
      reconnectTries: Number.MAX_VALUE, // 无限重连
      reconnectInterval: 500 // 重连间隔为500毫秒
    });
    
    mongoose.connection.on('error', (err) => {
      console.error(`Database connection error: ${err.message}`);
    });
    
    mongoose.connection.on('disconnected', () => {
      console.log('Disconnected from database');
      mongoose.connect('mongodb://your_connection_string', {
        useNewUrlParser: true,
        useUnifiedTopology: true,
        keepAlive: 30000,
        reconnectTries: Number.MAX_VALUE,
        reconnectInterval: 500
      });
    });
    

通过上述配置,即使连接断开,Mongoose也会自动尝试重新连接,从而避免频繁的手动干预。同时,通过设置reconnectTriesNumber.MAX_VALUE,确保连接会无限次尝试重新连接,直到成功为止。

希望这个解决方案能帮助你解决连接断开的问题。如果还有其他问题或需要进一步的帮助,请随时留言交流!


bae确实有些坑。。租个服务器吧,也不贵,配置一般的话也就是[80,200]块钱一个月。。:)

参考这个吧:https://github.com/BaiduAppEngine/bae-nodejs-sdk 另外我建议你使用mongoskin,我自己就用的这个。它内部使用已经解决了这个问题。 另外要说一下,百度的文档更新速度,跟不上系统开发速度。 这是个瓶颈,毕竟写文档,总是要占用很多时间,期待bae的进一步完善。

试一下mongolab,www.bluemix.net 内部集成mongolab服务

在BAE(百度应用引擎)上使用Node.js连接MongoDB时遇到的连接断开问题确实比较常见,特别是由于BAE对空闲连接的限制。解决这个问题的一种有效方式是通过定时重连机制,确保在连接断开后能够及时恢复连接。下面是具体的一些策略和示例代码。

解决方案

  1. 使用mongoose.connection.on('disconnected', ...)监听器: 当连接断开时,可以监听到disconnected事件,并在此事件中尝试重新连接。

  2. 使用setInterval进行定期检查: 定期检查连接状态,如果发现连接已断开,则尝试重新建立连接。

示例代码

const mongoose = require('mongoose');

mongoose.connect('mongodb://your-mongodb-connection-string', {
    useNewUrlParser: true,
    useUnifiedTopology: true
});

// 监听连接断开事件
mongoose.connection.on('disconnected', () => {
    console.log('Mongoose default connection disconnected');
    // 尝试重新连接
    mongoose.connect('mongodb://your-mongodb-connection-string', {
        useNewUrlParser: true,
        useUnifiedTopology: true
    });
});

// 设置一个定时器来定期检查连接状态
setInterval(() => {
    if (mongoose.connection.readyState === 0) { // 0 表示断开连接
        console.log('Connection was closed, attempting to reconnect...');
        mongoose.connect('mongodb://your-mongodb-connection-string', {
            useNewUrlParser: true,
            useUnifiedTopology: true
        });
    }
}, 10000); // 每10秒检查一次

console.log('Mongoose default connection open to', 'mongodb://your-mongodb-connection-string');

注意事项

  • 确保使用最新的mongoose版本。
  • 使用useNewUrlParseruseUnifiedTopology以避免一些已知的兼容性问题。
  • 连接字符串需要替换为你自己的MongoDB连接字符串。

通过这种方式,你可以有效地处理BAE上的连接断开问题,并保持你的应用正常运行。希望这能帮助到你!

回到顶部