我有一个运行多人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;
}
然后连接没有释放好吗?这样可以使连接保持活动状态,这是什么引起了问题?随着时间的流逝,经过一段随机的时间后,到处都会发生错误,而这些错误已经足够发生了,这是什么原因导致的?这就像开放连接的建立一样???
答案 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();
}
})
})
这意味着如果没有发生任何相关事件,则连接将保持打开状态。 我的游泳池将继续打开新的连接,但并不会总是被撤消。