修正分頁、Too many connection 問題

This commit is contained in:
2025-09-19 16:27:54 +08:00
parent bac364a667
commit 95c0c4cb23
20 changed files with 912 additions and 291 deletions

View File

@@ -15,17 +15,20 @@ const dbConfig = {
database: process.env.DB_NAME || 'db_AI_Platform',
charset: 'utf8mb4',
timezone: '+08:00',
acquireTimeout: 10000, // 10秒獲取連接超時
timeout: 10000, // 10秒查詢超時
acquireTimeout: 5000, // 5秒獲取連接超時
timeout: 8000, // 8秒查詢超時
reconnect: true,
connectionLimit: 5, // 減少連接數,避免 Too many connections
queueLimit: 10, // 允許排隊,避免立即失敗
connectionLimit: 3, // 進一步減少連接數,避免 Too many connections
queueLimit: 5, // 減少排隊數量
// 添加連接重試和錯誤處理配置
retryDelay: 2000,
maxRetries: 3,
retryDelay: 1000,
maxRetries: 2,
// 添加連接池配置
idleTimeout: 60000, // 1分鐘空閒超時,快速釋放連接
maxIdle: 5, // 最大空閒連接數
idleTimeout: 30000, // 30秒空閒超時,快速釋放連接
maxIdle: 2, // 最大空閒連接數
// 添加連接生命週期管理
maxReconnects: 3,
reconnectDelay: 2000,
// 添加 SSL 配置(如果需要)
ssl: false as any,
};
@@ -67,9 +70,9 @@ export class Database {
return await dbFailover.query<T>(sql, params);
}
let connection;
let connection: mysql.PoolConnection | null = null;
let retries = 0;
const maxRetries = 3;
const maxRetries = 2;
while (retries < maxRetries) {
try {
@@ -80,14 +83,19 @@ export class Database {
console.error(`資料庫查詢錯誤 (嘗試 ${retries + 1}/${maxRetries}):`, error.message);
if (connection) {
connection.release();
try {
connection.release();
} catch (releaseError) {
console.error('釋放連線時發生錯誤:', releaseError);
}
connection = null;
}
if (error.code === 'ECONNRESET' || error.code === 'PROTOCOL_CONNECTION_LOST') {
if (error.code === 'ECONNRESET' || error.code === 'PROTOCOL_CONNECTION_LOST' || error.code === 'ER_CON_COUNT_ERROR') {
retries++;
if (retries < maxRetries) {
console.log(`等待 ${2000 * retries}ms 後重試...`);
await new Promise(resolve => setTimeout(resolve, 2000 * retries));
console.log(`等待 ${1000 * retries}ms 後重試...`);
await new Promise(resolve => setTimeout(resolve, 1000 * retries));
continue;
}
}
@@ -95,7 +103,11 @@ export class Database {
throw error;
} finally {
if (connection) {
connection.release();
try {
connection.release();
} catch (releaseError) {
console.error('釋放連線時發生錯誤:', releaseError);
}
}
}
}
@@ -138,12 +150,22 @@ export class Database {
}
}
const connection = await this.getConnection();
let connection: mysql.PoolConnection | null = null;
try {
connection = await this.getConnection();
const [result] = await connection.execute(sql, params);
return result as mysql.ResultSetHeader;
} catch (error) {
console.error('資料庫插入錯誤:', error);
throw error;
} finally {
connection.release();
if (connection) {
try {
connection.release();
} catch (releaseError) {
console.error('釋放連線時發生錯誤:', releaseError);
}
}
}
}
@@ -167,12 +189,22 @@ export class Database {
}
}
const connection = await this.getConnection();
let connection: mysql.PoolConnection | null = null;
try {
connection = await this.getConnection();
const [result] = await connection.execute(sql, params);
return result as mysql.ResultSetHeader;
} catch (error) {
console.error('資料庫更新錯誤:', error);
throw error;
} finally {
connection.release();
if (connection) {
try {
connection.release();
} catch (releaseError) {
console.error('釋放連線時發生錯誤:', releaseError);
}
}
}
}
@@ -196,12 +228,22 @@ export class Database {
}
}
const connection = await this.getConnection();
let connection: mysql.PoolConnection | null = null;
try {
connection = await this.getConnection();
const [result] = await connection.execute(sql, params);
return result as mysql.ResultSetHeader;
} catch (error) {
console.error('資料庫刪除錯誤:', error);
throw error;
} finally {
connection.release();
if (connection) {
try {
connection.release();
} catch (releaseError) {
console.error('釋放連線時發生錯誤:', releaseError);
}
}
}
}