来自node.js Websocket服务器的间歇性500错误

时间:2019-06-05 11:02:11

标签: mysql node.js apache

我有一个运行多人html5游戏的websocket node.js应用程序(游戏服务器)。

游戏也有一个网站。游戏服务器和网站位于同一Apache VPS上。

游戏服务器使用mysql从node.js mysql包中使用mysql池来存储和检索数据。

它可以在99%的时间内正常工作,但是间歇地在某个随机点突然停止能够获得mysql连接。

这种情况发生时,网站停止工作并显示500 http错误。我相信这是导致游戏服务器出现问题的原因。由于出现500 http错误,因此无法再连接mysql,因此pool.getConnection在游戏服务器中不再起作用。

我感到奇怪的是,即使Apache抛出500错误,仍然可以像往常一样通过websocket成功访问游戏服务器。似乎停止在游戏服务器内部工作的唯一事物是mysql。游戏客户端通过websocket连接到游戏服务器,并且除了能够连接到mysql之外,其他功能正常运行。

如果我ctrl + c游戏服务器停止node.js应用程序(游戏服务器),则500错误消失了。该网站立即重新启动,然后,如果我重新启动游戏服务器,则mysql现在又可以工作了。

很明显,游戏服务器中的某种原因导致了这种情况的发生。到目前为止,我找不到它是什么。我现在被困住了,我花了整整一个星期的时间来尝试调试所能想到的一切。

在mysql上运行调试模式后,我看到了这一点;

<-- ErrorPacket
ErrorPacket {
fieldCount: 255,
errno: 1203,
sqlStateMarker: '#',
sqlState: '42000',
message: 'User (i've hidden this) already has more than 
\'max_user_connections\' 
active connections' }

但是我将其设置为100000个连接。没有太多的方法可以使用。每次完成连接时,我都会使用connection.release()将其放回池中。我需要做什么来解决这个问题?

拜托,您必须调试的任何建议将不胜感激!

谢谢。

这是我在游戏服务器中使用mysql的方式

const mysql = require('mysql');

const pool = mysql.createPool({
        connectionLimit : 100000,
        host     : '***********',
        user     : '***********',
        password : "'***********",
        database : '***********',
        debug    :  true
});


pool.getConnection(function(err,connection){

    if (err) {
        console.log(err);
        return false;
    }   

    connection.query("select * from aTable  ",function(err,rows){

        if(err) {
            console.log(err);
            connection.release();
            return false;

        }

        // dos stuff here

        connection.release();
    })

})

我想知道的一件事是,顶部错误捕获块中是否有错误 在这里->

 pool.getConnection(function(err,connection){

        if (err) {
            console.log(err);
            return false;
        }

然后连接没有释放好吗?这样可以使连接保持活动状态,这是什么引起了问题?随着时间的流逝,经过一段随机的时间后,到处都会发生错误,而这些错误已经足够发生了,这是什么原因导致的?这就像开放连接的建立一样???

1 个答案:

答案 0 :(得分:0)

这是我犯的错误;

pool.getConnection(function(err,connection){

    if (err) {
        console.log(err);
        return false;
    }   

    connection.query("select * from aTable  ",function(err,rows){

        if(err) {
            console.log(err);
            connection.release();
            return false;

        }

        if(somethingrelevant){

            // do stuff

            connection.release();

        }

    })

})

这意味着如果没有发生任何相关事件,则连接将保持打开状态。 我的游泳池将继续打开新的连接,但并不会总是被撤消。