修正分頁、Too many connection 問題
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user