У меня есть приложение websocket node.js (игровой сервер), которое запускает многопользовательскую игру html5.
У игры также есть сайт. Игровой сервер и сайт находятся на одном Apache VPS.
Игровой сервер использует mysql для хранения и извлечения данных с использованием пула mysql из пакета node.js mysql.
Он работает нормально в 99% случаев, но периодически, в случайной точке, он внезапно перестанет быть в состоянии установить соединение MySQL.
Когда это происходит, веб-сайт перестает работать и выдает ошибку 500 http. Я считаю, что это и является причиной проблемы на игровом сервере. Из-за ошибки 500 http, mysql больше не может быть подключен и, таким образом, pool.getConnection больше не работает на игровом сервере.
Мне кажется странным, что, несмотря на то, что Apache выдает ошибку 500, к игровому серверу все еще можно получить доступ через веб-сокет, как обычно. Единственное, что перестало работать на игровом сервере, - это mysql. Игровой клиент подключается к игровому серверу через веб-сокет, и функции работают правильно, за исключением возможности подключения к 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();
})
})
1 что мне интересно, если есть ошибка в верхнем блоке перехвата ошибок
здесь ->
pool.getConnection(function(err,connection){
if (err) {
console.log(err);
return false;
}
Тогда связь не освобождается, верно? Так что это будет поддерживать связь, и это является причиной проблемы? со временем происходит ошибка здесь и там, через случайный промежуток времени, достаточно ли этого происходит, и это его вызывает? это как наращивание открытых соединений ???