gpt4 book ai didi

mysql - 来自 Node.js WebSocket 服务器的间歇性 500 错误

转载 作者:行者123 更新时间:2023-11-29 15:55:55 25 4
gpt4 key购买 nike

我有一个运行多人 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 上运行 Debug模式后,我看到了这个;

<-- 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();
})

})

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

 pool.getConnection(function(err,connection){

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

那么连接没有释放吧?那么这会保持连接处于事件状态,这就是导致问题的原因吗?随着时间的推移,错误到处发生,经过一段随机的时间后,发生了足够多的错误,这就是导致错误的原因?这就像建立开放的连接???

最佳答案

这是我犯的错误;

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();

}

})

})

这意味着如果相关的事情没有发生,那么连接将保持打开状态。我的池将继续打开新连接,但它们并不总是被放回去。

关于mysql - 来自 Node.js WebSocket 服务器的间歇性 500 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56459193/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com