V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
laoisaudi
V2EX  ›  Node.js

针对 bae 免费的 mongodb 不支持长连接问题,大家有什么方法

  •  
  •   laoisaudi · 2014-09-03 09:51:07 +08:00 · 7382 次点击
    这是一个创建于 3712 天前的主题,其中的信息可能已经有所发展或是发生改变。
    最近在试着用bae来搭一个nodejs的server,database用免费的mongodb,用mongoose连接,但是会出现一段时间没请求会断掉会数据库的连接,然后一旦有请求进来就崩掉,bae的lightpd会重启server。
    对此,我在models里的mongodb模块写了针对断线重连的处理,但是貌似不管用,请大家指教,代码如下:
    var mongoose = require('mongoose');
    mongoose.connect('mongodb://username:[email protected]/database', {server: {auto_reconnect:true]});
    mongoose.connection.on('close', function(){
    mongoose.connect('mongodb://username:[email protected]/database', {server: {auto_reconnect:true]});
    });

    exports.mongoose = mongoose;


    感谢大家的解答!
    第 1 条附言  ·  2014-09-03 13:44:56 +08:00
    现附上成功的代码:
    //mongodb.js
    var mongoose = require('mongoose');
    mongoose.connect('mongodb://username:[email protected]:8908/database', {server: {auto_reconnect:true}});

    mongoose.connection.on('close', function(){
    mongoose.connect('mongodb://username:[email protected]:8908/database', {server:{auto_reconnect:true}});
    });
    mongoose.connection.on('error', function(error){
    console.log('error + ' + error);
    mongoose.disconnect();
    });
    exports.mongoose = mongoose;
    25 条回复    2014-09-03 15:10:06 +08:00
    ipconfiger
        1
    ipconfiger  
       2014-09-03 09:53:14 +08:00
    用一个计时器来记录alive的时间,超过时间就主动断掉重连
    laoisaudi
        2
    laoisaudi  
    OP
       2014-09-03 09:54:39 +08:00
    @ipconfiger 这个方法可以考虑,但是不知道为什么上面的方法会不管用
    linKnowEasy
        3
    linKnowEasy  
       2014-09-03 09:56:18 +08:00
    怎么做到网页变色的。。。
    laoisaudi
        4
    laoisaudi  
    OP
       2014-09-03 09:57:01 +08:00
    @linKnowEasy 本来就是这个颜色的。。估计nodejs版的风格吧。。
    WildCat
        5
    WildCat  
       2014-09-03 10:17:15 +08:00
    WildCat
        6
    WildCat  
       2014-09-03 10:17:48 +08:00
    WildCat
        7
    WildCat  
       2014-09-03 10:18:05 +08:00
    WildCat
        8
    WildCat  
       2014-09-03 10:18:47 +08:00   ❤️ 1
    跪了。。。不玩了
    laoisaudi
        9
    laoisaudi  
    OP
       2014-09-03 10:19:55 +08:00
    @WildCat 哈哈,多谢多谢,你辛苦了
    laoisaudi
        10
    laoisaudi  
    OP
       2014-09-03 10:30:44 +08:00
    @WildCat 果然有用!
    RangerWolf
        11
    RangerWolf  
       2014-09-03 10:31:46 +08:00
    我遇到跟你一样的情况,然后我就把DAO层全部换成MYSQL,世界就美好很多了~
    WildCat
        12
    WildCat  
       2014-09-03 10:31:49 +08:00
    @laoisaudi 哈,偶尔还是会出现数据库连接问题,另外我没有考虑这种做法开销大小。
    我只是做了个参加坑爹比赛的项目而已~

    坐等年底用AWS啦
    laoisaudi
        13
    laoisaudi  
    OP
       2014-09-03 10:37:38 +08:00
    @WildCat 还会有问题?会是些什么问题?让我有个心理准备。。哈哈
    然后我也准备用aws的,为啥要等年底?
    laoisaudi
        14
    laoisaudi  
    OP
       2014-09-03 10:38:23 +08:00
    @RangerWolf souga
    odirus
        15
    odirus  
       2014-09-03 10:49:20 +08:00
    楼主,你的代码是针对接收到 close 事件再断线重连,但是只有当 TCP 最后一次握手成功或者是直接 socket.destroy 的时候才会触发该事件。假设 mongoose 接收到 error 事件并正处于最后的握手等待期,写数据的时候就会出现 socket 错误,倘若这个时候你没有捕获错误,程序就会崩溃。我一直都是用的 mongodb 模块,当传输数据的时候如果发生错误,它不仅会断线重连,而且还会缓存这部分命令,直到缓存池中有可用连接的时候再发送。
    laoisaudi
        16
    laoisaudi  
    OP
       2014-09-03 11:02:14 +08:00
    @odirus 嗯嗯,多谢,我修改了代码,加了一个捕获error的回调,使得出错的时候先断掉连接,然后让他触发close的回调
    WildCat
        17
    WildCat  
       2014-09-03 11:06:28 +08:00 via iPhone
    @laoisaudi 年底才完全开放商用吧

    我偶尔还是会遇到数据库连接错误
    laoisaudi
        18
    laoisaudi  
    OP
       2014-09-03 11:09:57 +08:00
    @WildCat 噢噢,我昨天看到有免费使用,就准备去试试
    WildCat
        19
    WildCat  
       2014-09-03 11:13:24 +08:00 via iPhone
    @laoisaudi 你有申请到AWS的预览名额?我很早就申请了,很久之后他们客户经理给我打电话,问我是干嘛的,我说大学生,他说只提供给着急迁移到AWS的大客户,让我等年底正式商用
    oott123
        20
    oott123  
       2014-09-03 11:23:00 +08:00 via Android   ❤️ 1
    @WildCat 你说的是国内版 aws 吧…楼主说的好像是国际版?
    laoisaudi
        21
    laoisaudi  
    OP
       2014-09-03 12:38:24 +08:00
    @WildCat @oott123 对的,我说的是国际版,因为要信用卡。。。所以还没申呢。。在弄信用卡
    nasa
        22
    nasa  
       2014-09-03 13:27:50 +08:00
    @laoisaudi 最后成功使用的代码能分享下吗?
    laoisaudi
        23
    laoisaudi  
    OP
       2014-09-03 13:45:14 +08:00
    @nasa 已分享
    julor
        24
    julor  
       2014-09-03 14:30:51 +08:00
    可以考虑使用收费的私有mongodb。
    我用的是: http://cnodejs.org/topic/52e0f31a78990b0411b585d9
    laoisaudi
        25
    laoisaudi  
    OP
       2014-09-03 15:10:06 +08:00
    @julor 等有钱一定用。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5507 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 08:19 · PVG 16:19 · LAX 01:19 · JFK 04:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.