Class MemRS
java.lang.Object
server.quest.MemRS
極簡「記憶體列游標」(In-Memory Result cursor)。
目的:消除 MapleQuest.initQuests() 的 N+1 查詢。原本每一筆任務都要再對
wz_questreqdata / wz_questactdata / wz_questpartydata 各跑一次
WHERE questid=?,每個動作再對 wz_questact{item,skill,quest}data 各跑一次
WHERE uniqueid=?,共約 2 萬多次序列化查詢(實測佔開服時間約 54 秒)。
改法:每個子表只整批 SELECT * 一次,在記憶體用 groupBy(Connection, String, String) 依鍵分組;
之後以本類別重播某一鍵的資料列。本類別只實作既有解析邏輯用到的
next()/getInt(String)/getString(String)/close(),因此
MapleQuest.loadQuest(ResultSet, MemRS.Grouped, MemRS.Grouped, MemRS.Grouped, MemRS.Grouped, MemRS.Grouped, MemRS.Grouped)、MapleQuestAction、MapleQuestRequirement
的逐欄解析程式碼幾乎原封不動,只是把資料來源從「DB 查詢」換成「記憶體查表」。
語意比照 JDBC:getInt 遇 SQL NULL 回傳 0;getString 遇 NULL 回傳 null。
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionstatic final class某資料表全表內容,依鍵欄分組後可逐鍵發出獨立游標(每次MemRS.Grouped.rows(int)都是全新游標)。 -
Method Summary
Modifier and TypeMethodDescriptionvoidclose()intstatic MemRS.Grouped便利多載:使用目前執行緒的DatabaseConnection連線。static MemRS.GroupedgroupBy(Connection con, String table, String keyCol) 一次整批SELECT * FROM <table>,依keyCol在記憶體分組。booleannext()
-
Method Details
-
next
public boolean next() -
close
public void close() -
getString
-
getInt
-
groupBy
public static MemRS.Grouped groupBy(Connection con, String table, String keyCol) throws SQLException 一次整批SELECT * FROM <table>,依keyCol在記憶體分組。 等同把原本 N 次SELECT * FROM <table> WHERE keyCol = ?壓成 1 次全表掃描。- Throws:
SQLException
-
groupBy
便利多載:使用目前執行緒的DatabaseConnection連線。- Throws:
SQLException
-