資料同步程式需從外網資料庫一次查詢 50 萬筆 FundYield 資料。伺服器記憶體緊張,SQL Server 佔用 500 MB+,單次查詢逾時失敗。原邏輯以 ZHXGRQ (最後修改日) 為增量標記,但 51 萬筆資料同為 1999-01-01,無法增量,須全量抓取。
發現資料表含 ID (bigint) 欄位,雖非 PK 但唯一不重複,可作為分頁游標,每次查 10-20 萬筆,避免記憶體暴衝。
namespace WFT_DataSyncModel {
[Serializable()]
public partial class FundYield : EntityBase, WcfMail.Interface.IDataSyncEntity {
public FundYield() {
TableName = "FundYield";
EntityMap = EntityMapType.SqlMap; // 關鍵:使用自訂 SQL 對應
PrimaryKeys.Add("jjdm");
PrimaryKeys.Add("FSRQ");
PropertyNames = new string[] { "ID", "jjdm", "jjmc", /* ...其餘 60+ 欄位...*/ };
PropertyValues = new object[PropertyNames.Length];
}
// 屬性略...
}
}
EntityMapType.SqlMap 告訴框架不直接對應資料表,而是讀取
EntitySqlMap.config中的自訂查詢 SQL。
命名空間 與 Map name 必須與實體類完全一致。
WHERE 條件,例如:WHERE ID >= 600000 AND ID < 800000
面對記憶體受限的大量資料查詢,**「分頁游標 + 外部化 SQL 映射」** 是輕量、可維護的解法。將 SQL 從程式碼剝離至設定檔,配合實體類的 SqlMap 模式,達到「不改程式碼、只改設定」的運維彈性,正是物件導向處理純資料問題的優雅體現。