新增 競賽建立、評審建立、團隊建立

This commit is contained in:
2025-09-15 13:32:30 +08:00
parent b85a9ce95e
commit 31ffaa1974
31 changed files with 5163 additions and 455 deletions

View File

@@ -15,17 +15,17 @@ const dbConfig = {
database: process.env.DB_NAME || 'db_AI_Platform',
charset: 'utf8mb4',
timezone: '+08:00',
acquireTimeout: 60000,
timeout: 60000,
acquireTimeout: 10000, // 10秒獲取連接超時
timeout: 10000, // 10秒查詢超時
reconnect: true,
connectionLimit: 10,
queueLimit: 0,
connectionLimit: 5, // 減少連接數,避免 Too many connections
queueLimit: 10, // 允許排隊,避免立即失敗
// 添加連接重試和錯誤處理配置
retryDelay: 2000,
maxRetries: 3,
// 添加連接池配置
idleTimeout: 300000,
maxIdle: 10,
idleTimeout: 60000, // 1分鐘空閒超時快速釋放連接
maxIdle: 5, // 最大空閒連接數
// 添加 SSL 配置(如果需要)
ssl: false as any,
};
@@ -41,7 +41,9 @@ export class Database {
private constructor() {
this.pool = pool;
this.useFailover = process.env.DB_FAILOVER_ENABLED === 'true';
// 強制啟用備援功能,確保系統穩定性
this.useFailover = true;
console.log('🔄 資料庫備援功能已啟用');
}
public static getInstance(): Database {
@@ -124,15 +126,13 @@ export class Database {
if (syncStatus.enabled) {
const result = await dbSync.dualInsert(sql, params);
if (result.success) {
// 返回主機的結果(如果主機成功)
if (result.masterSuccess) {
return await dbFailover.insert(sql, params);
} else if (result.slaveSuccess) {
// 如果只有備機成功,返回備機結果
return await dbFailover.insert(sql, params);
}
// 雙寫成功,直接返回成功結果
// 不需要重新執行查詢,因為雙寫已經完成
return { insertId: 0, affectedRows: 1 } as mysql.ResultSetHeader;
} else {
// 雙寫失敗,拋出錯誤
throw new Error(`雙寫失敗: 主機${result.masterError || '成功'}, 備機${result.slaveError || '成功'}`);
}
throw new Error(`雙寫失敗: 主機${result.masterError || '成功'}, 備機${result.slaveError || '成功'}`);
} else {
return await dbFailover.insert(sql, params);
}
@@ -155,15 +155,13 @@ export class Database {
if (syncStatus.enabled) {
const result = await dbSync.dualUpdate(sql, params);
if (result.success) {
// 返回主機的結果(如果主機成功)
if (result.masterSuccess) {
return await dbFailover.update(sql, params);
} else if (result.slaveSuccess) {
// 如果只有備機成功,返回備機結果
return await dbFailover.update(sql, params);
}
// 雙寫成功,直接返回成功結果
// 不需要重新執行查詢,因為雙寫已經完成
return { insertId: 0, affectedRows: 1 } as mysql.ResultSetHeader;
} else {
// 雙寫失敗,拋出錯誤
throw new Error(`雙寫失敗: 主機${result.masterError || '成功'}, 備機${result.slaveError || '成功'}`);
}
throw new Error(`雙寫失敗: 主機${result.masterError || '成功'}, 備機${result.slaveError || '成功'}`);
} else {
return await dbFailover.update(sql, params);
}
@@ -186,15 +184,13 @@ export class Database {
if (syncStatus.enabled) {
const result = await dbSync.dualDelete(sql, params);
if (result.success) {
// 返回主機的結果(如果主機成功)
if (result.masterSuccess) {
return await dbFailover.delete(sql, params);
} else if (result.slaveSuccess) {
// 如果只有備機成功,返回備機結果
return await dbFailover.delete(sql, params);
}
// 雙寫成功,直接返回成功結果
// 不需要重新執行查詢,因為雙寫已經完成
return { insertId: 0, affectedRows: 1 } as mysql.ResultSetHeader;
} else {
// 雙寫失敗,拋出錯誤
throw new Error(`雙寫失敗: 主機${result.masterError || '成功'}, 備機${result.slaveError || '成功'}`);
}
throw new Error(`雙寫失敗: 主機${result.masterError || '成功'}, 備機${result.slaveError || '成功'}`);
} else {
return await dbFailover.delete(sql, params);
}