nodejs mysql2 pool 报错崩溃 Uncaught Error: read ECONNRESET 如何解决 完整示例
时间: 2024-11-29 15:17:27 浏览: 34
在Node.js中使用`mysql2`库的连接池(`createPool()`)时,如果遇到`Uncaught Error: read ECONNRESET`这样的错误,通常是由于网络连接问题、数据库服务器故障或是数据库连接超时造成的。这里有一些可能的解决方案:
1. **检查网络连通性**:确保你的应用能够正常访问MySQL服务器。如果是内部网络,检查防火墙设置;如果是外部服务器,确认IP地址和端口是否可用。
2. **超时设置**:在创建连接池时,可以设置`connectionTimeout`和`queueLimit`等属性。例如:
```javascript
const pool = mysql.createPool({
host: 'your_host',
user: 'your_user',
password: 'your_password',
database: 'your_database',
waitForConnections: true,
connectionTimeout: 60000, // 设置连接超时时间,单位毫秒,默认为28000ms
queueLimit: 0, // 如果超过队列限制,将会抛弃后续请求,直到有连接可用
});
```
3. **连接池配置**:确保你的连接池足够大以应对预期的并发请求,避免因为竞争连接而导致过多的`ECONNRESET`。
4. **异常处理**:
```javascript
async function getConnectionFromPool() {
try {
const connection = await pool.getConnection();
return connection.promise; // 使用Promise包装,方便链式操作
} catch (error) {
if (error instanceof mysql.ConnectionError && error.code === 'ER_CONNECTION_LOST') {
console.error('Lost connection, attempting to reconnect...');
return getConnectionFromPool(); // 重试连接
} else {
throw error;
}
}
}
async function executeQuery(query) {
try {
const connection = await getConnectionFromPool();
const [rows] = await connection.query(query);
connection.release(); // 执行完毕后释放连接
return rows;
} catch (error) {
console.error('Error executing query:', error);
// 可能需要记录错误并关闭连接
connection && connection.destroy();
throw error;
}
}
```
5. **监控与日志**:安装并启用性能监控工具(如PM2或nodemon),以便在发生这类错误时能够追踪并快速定位问题。
完整示例(简化版):
```javascript
const mysql = require('mysql2/promise');
async function getConnection() {
try {
return await mysql.createPool({ /* ... */ }).getConnection();
} catch (error) {
if (error.errno === -4077 && error.code === 'ER_CONNECTION_RESET') {
console.error('Connection reset:', error);
// 重试获取连接
return getConnection();
} else {
throw error;
}
}
}
async function executeQuery(connection, query) {
try {
const [rows] = await connection.query(query);
return rows;
} finally {
connection && connection.end();
}
}
(async () => {
try {
const connection = await getConnection();
const result = await executeQuery(connection, 'SELECT * FROM your_table');
console.log(result);
} catch (error) {
console.error('Error occurred:', error);
}
})();
```
阅读全文