ImageVerifierCode 换一换
格式:DOCX , 页数:21 ,大小:345.41KB ,
资源ID:17624326      下载积分:1 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-17624326.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(如何使用Delphi开发大型主从架构系统.docx)为本站会员(b****0)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

如何使用Delphi开发大型主从架构系统.docx

1、如何使用Delphi开发大型主从架构系统如 何 使 用 Delphi 開 發 大 型 主 從 架 構 系 統 - Package 的 秘 密 和 威 力相 信 許 多 人 和 我 一 樣 , 在 使 用 Delphi 開 發 應 用 系 統 的 時 候 , 一 定 會 想 到 如 何 的 切 割 整 個 應 用 系 統 。 是 把 所 有 的 子 系 統 撰 寫 成 一 個 很 大 ( 可 能 會 有 數 M .Bytes 的 大 小 ) 的 EXE 檔 呢 ? 還 是 應 該 把 每 一 個 模 組 撰 寫 在 不 同 的 EXE 檔 案 之 中 的 好 。事 實 上 這 兩 種 方 法 都

2、 有 它 們 自 己 的 問 題 。 如 果 是 把 所 有 的 模 組 撰 寫 在 一 個 EXE 檔 案 之 中 的 話 , 那 麼 不 但 執 行 檔 太 大 , 不 易 更 新 和 維 護 。 在 開 發 時 也 不 甚 方 便 , 因 為 要 讓 數 個 人 撰 寫 同 一 支 應 用 程 式 的 確 比 較 麻 煩 。 那 麼 如 果 我 們 把 每 一 個 模 組 讓 不 同 的 程 式 師 撰 寫 成 獨 立 的 EXE 檔 案 , 再 由 一 個 主 程 式 分 別 啟 動 不 同 的 EXE 檔 不 就 好 了 嗎 ? 沒 錯 這 是 許 多 人 使 用 的 方 法 ( 包

3、 括 我 在 內 ) , 但 是 這 樣 切 割 應 用 系 統 有 一 個 問 題 , 那 就 是 如 果 每 一 個 獨 立 的 EXE 模 組 , 都 需 要 使 用 資 料 庫 的 話 , 那 麼 當 主 程 式 啟 動 個 別 的 EXE 檔 案 時 , 每 一 個 EXE 都 必 須 重 新 再 連 結 到 資 料 庫 , 開 啟 資 料 庫 表 格 , 再 取 得 它 需 要 的 資 料 。 這 個 過 程 通 常 都 需 要 不 少 的 時 間 。 例 如 連 結 到 Oracle 並 且 開 啟 一 個 資 料 庫 表 格 的 話 , 通 常 需 要 五 到 十 秒 。 如

4、果 EXE 開 啟 的 資 料 庫 表 格 或 是 查 詢 比 較 多 的 話 , 那 麼 主 程 式 在 啟 動 獨 立 的 EXE 檔 案 時 , 通 常 需 要 3 0 幾 秒 到 一 分 鐘 不 等 。 這 對 於 許 多 的 使 用 者 而 言 是 非 常 不 方 便 的 。 這 樣 的 狀 狀 甚 至 會 造 成 你 的 專 案 無 法 交 貨 ( 例 如 使 用 者 要 求 在 五 秒 之 內 EXE 程 式 的 畫 面 必 須 出 現 ) 。 除 此 之 外 , 每 一 個 獨 立 的 EXE 又 使 用 了 額 外 的 連 結 以 便 存 取 資 料 庫 , 造 成 了 資

5、源 的 浪 費 。 面 對 這 種 二 難 的 局 面 , 你 現 在 的 選 擇 是 什 麼 呢 ?事 實 上 這 個 問 題 在 我 的 心 中 也 盤 旋 了 許 久 。 因 為 這 一 是 我 想 要 解 決 的 問 題 , 只 是 由 於 工 作 的 繁 忙 讓 我 一 直 無 法 花 時 間 解 決 它 。 最 近 在 手 上 的 事 情 告 一 段 落 之 後 , 又 接 到 許 多 朋 友 的 詢 問 , 所 以 決 定 花 一 些 時 間 試 著 解 決 這 個 重 要 的 問 題 。增 加 應 用 程 式 載 入 的 效 率如 果 我 們 仔 細 的 思 考 這 個 問 題

6、 的 話 , 就 可 以 發 現 問 題 出 在 每 一 支 獨 立 的 EXE 都 需 要 重 複 的 連 結 資 料 庫 所 至 。 所 以 如 果 我 們 可 以 讓 連 結 到 資 料 庫 的 次 數 減 少 的 話 , 不 就 可 以 加 快 應 用 程 式 載 入 的 效 率 了 嗎 ?這 個 想 法 當 然 很 簡 單 , 但 是 問 題 是 要 如 何 的 減 少 應 用 程 式 連 結 資 料 庫 的 次 數 呢 ? 事 實 上 這 個 想 法 也 很 簡 單 , 最 好 是 讓 應 用 系 統 連 結 資 料 庫 的 次 數 變 成 一 次 , 如 此 一 來 除 了 主

7、程 式 需 要 連 結 資 料 庫 之 外 , 其 他 的 應 用 模 組 都 能 夠 公 同 使 用 由 主 程 式 載 入 的 資 料 模 組 的 話 , 那 麼 一 切 問 題 不 都 解 決 了 嗎 ? 請 注 意 , 在 這 裡 我 所 說 的 其 他 模 組 代 表 獨 立 的 EXE 或 是 其 他 形 式 的 應 用 程 式 , 而 不 是 指 在 單 一 一 個 EXE 之 中 不 同 的 表 格 或 是 子 系 統 。我 們 可 以 使 用 圖 一 來 表 示 這 個 想 法 。 在 這 個 構 想 中 , 我 希 望 由 應 用 主 程 式 先 負 責 載 入 公 用 的

8、 資 料 模 組 。 在 這 個 資 料 模 組 之 中 有 其 他 子 系 統 需 要 使 用 各 個 資 料 庫 表 格 , 如 此 一 來 當 主 程 式 啟 動 其 他 的 子 系 統 時 , 就 不 需 要 再 讓 每 一 個 子 系 統 再 連 結 , 開 啟 資 料 庫 表 格 了 。圖一公 用 資 料 模 組 示 意 圖當 這 樣 還 有 一 些 設 計 上 的 問 題 , 我 們 稍 後 再 回 來 討 論 這 個 問 題 , 現 在 先 我 們 看 看 如 何 的 把 這 個 構 想 實 做 出 來 , 並 且 測 試 一 下 實 際 的 結 果 是 不 是 真 的 比 較

9、 有 效 率 。要 實 做 這 個 構 想 , 我 們 必 須 想 辦 法 讓 公 用 的 資 料 模 組 能 夠 讓 每 一 個 子 系 統 存 取 到 , 並 且 不 再 需 要 每 一 個 子 系 統 都 分 別 的 和 資 料 庫 建 立 一 個 連 結 的 Session。 我 的 第 一 個 想 法 是 使 用 DLL來 解 決 這 個 問 題 。 但 是 事 實 上 使 用 DLL無 法 解 決 這 個 問 題 。 在 我 花 費 了 許 多 的 時 間 之 後 , 使 用 DLL仍 然 有 會 有 Access Violation的 錯 誤 。 我 也 曾 在 網 路 上 搜

10、尋 相 關 的 問 題 或 是 資 料 , 我 在 寶 蘭 的 Discuss Forum中 也 看 到 有 人 提 出 類 似 的 問 題 , 但 是 似 乎 都 沒 有 人 確 實 的 回 答 這 個 問 題 。 我 也 想 過 乾 脆 拿 出 我 的 Soft-Ice 和 Bounds-Checker 看 看 為 什 麼 使 用 DLL Assembly 打 交 道 , 這 實 在 不 是 件 好 玩 的 事 情 。 正 打 算 放 棄 之 時 , 突 然 想 到 Delphi 3.0 之 中 的 Package 不 正 是 解 決 這 個 問 題 的 好 方 法 嗎 ? 於 是 我 就

11、 決 定 試 試 看 , 果 然 一 擊 中 地 , 順 利 的 解 決 了 這 個 問 題 。 當 然 , 要 知 道 為 什 麼 使 用 Package 可 以 解 決 這 個 問 題, 你 需 要 知 道 Package 和 DLL 的 異 同 。DLL 和 Package為 什 麼 在 我 一 開 始 使 用 DLL時 無 法 解 決 多 個 模 組 共 用 一 個 資 料 模 組 DLL的 問 題 呢 ? 這 主 要 是 因 為 在 Win 95/NT中 當 每 一 個 模 組 載 入 DLL時 , 對 於 每 一 個 DLL之 中 的 全 域 變 數 而 言 , 每 一 個 模 組

12、 都 會 有 一 份 獨 立 的 變 數 。 這 是 什 麼 意 思 呢 ? 我 們 可 以 使 用 圖 二 來 說 明 。圖 二 Win 95/NT 中 全 域 變 數 和 模 組 的 關 係當 圖 二 中 的 模 組 一 和 模 組 二 分 別 的 載 入 它 們 共 用 的DLL 時 , 雖 然 在 這 個 共 用 的 DLL 中 有 一 個 全 域 變 數gAccount 。 但 是 模 組 一 和 模 型 二 會 分 別 的 擁 有 一 個gAccount 變 數 。 這 也 就 是 說 模 組 一 對 於gAccount 變 數 數 值 所 做 的 修 改 並 不 會 影 響 模

13、組 二 中 的gAccount 變 數 數 值 。 在 Wn 95/NT 中 的DLL 行 為 是 和 Win 3.x 不 同 的 , 因 為 在 Win 3.x 中 所 有 的 模 組 都 使 是 共 用 一 份 DLL 中 的 全 域 變 數 。由 於 Win 95/NT 中 DLL 全 域 變 數 的 這 種 特 性 , 所 以 當你 想 把 資 料 模 組 撰 寫 在DLL 之 中 讓 多 個 模 組 共 同使 用 時 , 問 題 就 來 了 。 因 為 在 這 種 情 形 下 , 每 一 個 模 組 都 會 有 一 份 它 自 己 的 資 料 模 組 。 所 以 當 每一 個 應 用

14、 程 式 模 組 載 入 資 料 模 組 的 DLL 時 , 它 仍 然 會 連 結 資 料 庫 一 次 , 所 以 你 並 無 法 減 少 連 結資 料 庫 的 次 數 。那 麼 使 用 Package 有 什 麼 不 同 嗎 ? 在 回 答 這 個 問 題 之 前 , 請 你 先 回 想 一 下 。 在 Delphi 3.x 中 它 允 許 你 使 用 Package 的 功 能 來 編 譯 你 的 應 用 程 式 , 如 圖 三 所 示 。圖 三 Delphi 3.x 允 許 你 使 用Package 的 功 能 編 譯 應 用 程式使 用 Package 編 譯 應 用 程 式 的 好

15、 處 除 了 可 以 減 少 應 用 程 式 的 大 小 之 外 , 事 實 上 Package 還 有 一 個 很 重 要 的 特 性 , 那 就 是 Package 允 許 多 個 模 組 共 用 所 有 的 全 域 變 數 。我 們 可 以 使 用 圖 四 來 說 明 Package 的 特 性 。 請 你 想 一 想 , 當 你 的 應 用 程 式 使 用 Package 的 功 能 時 ,事 實 上 它 必 須 載 入 許 多 不 同 的 Packages 。 不 管 你 的 應 用 程 式 是 否 使 用 了 全 域 變 數 Application , 許 多 的 Packages

16、 都 會 使 用 Application 這 個 全 域 變 數 。 由 於 全 域 變 數 Application 是 存 在 於 VCL.DPL 之 中 , 所 以 如 果 Application 會 對 於 每 一 個 載 入 它 的 模 組 都 產 生 一 份 獨 立 的 全 域 變 數 的 話 , 那 麼 整 個 應 用 程 式 便 會 產 生 不 正 確 的 結 果 。 所 以 由 這 個 說 明 我 們 可 以 知 道 , 在 圖 四 中 的 Application 和 Screen 等 全 域 變 數 對 於 所 有 使 用 它 的 模 組 而 言 一 定 是 只 有 一 份

17、全 域 變 數 。圖 四 Package 中 全 域 變 數 的 特 性事 實 上 在 Forms.PAS 之 中 的 程 式 碼 也 透 露 著 這 些 蛛 絲 馬 跡 。 例 如 下 面 便 是 Forms.PAS 宣 告 Application 和 Screen 這 二 個 變 數 的 程 式 碼 。 從 它 們 的 注 釋 中 我們 可 以 清 楚 的 看 到 , 它 們 是 全 域 物 件 , 即 使 是 編 譯 成 Package 時 也 是 一 樣 。 Global objects varApplication: TApplicationScreen: TScreenCtl3DB

18、tnWndProc: Pointer = nil;由 於 Package 能 夠 自 動 的 將 其 中 的 全 域 變 數 編 譯 成 所 有 使 用 它 的 模 組 都 共 用 一 份 的 特 性 。 所 以 我 們 就 可 以 使 用 這 個 特 性 重 新 的 建 構 圖 一 的 架 構 成 為 圖 五 的 形 式 。圖 五 改 良 過 的 公 用 資 料 模 組 示 意 圖在 圖 五 中 我 們 可 以 把 所 有 模 組 需 要 共 同 使 用 的 資 料 模 組 撰 寫 在 一 個 Package 之 中 , 然 後 再 把 每 一 個 子 系 統 撰 寫 成 獨 立 的 Pac

19、kage 。 只 有 主 程 式 是 EXE , 它 負 責 載 入 共 用 的 資 料 模 組 , 以 及 在 使 用 者 啟 動 每 一 個 子 系 統 時 再 載 入 相 對 應 的 子 系 統 Package 。使 用 這 種 架 構 有 許 多 的 好 處 。 第 一 個 便 是 共 用 的 資 料 模 組 只 需 要 載 入 一 次 即 可 。 而 這 個 好 處 便 是 我 們 前 面 討 論 需 要 解 決 的 問 題 。 如 此 一來 在 每 一個 子 系 統 載 入 時 便 可 以 加 快 其 執 行 的 速 度 。 第 二 個 好 處 是 在 開 發 這 整 個 系 統

20、時 , 我 們 仍 然 可 以 讓不 同 的 程 式 師 負 責 發 展 不 同 的 子 系 統 , 這 樣 可 以 就 可 以 解 決 前 面 討 論 的 分 工 的 問 題 。 此 外 如 果 一 個 子系 統 很 龐 大 的 話 , 你 也 可 以 再 次 的 切 割 這 個 子 系 統 成 為 更 多 的 小 系 統 。 例 如 你 可 以 再 把 圖 五中 的 會 計 子 系 統 Package 再 分 為 一 般 會 計 , 成 本 會 計 , 和 管 理 會 計 等 不 同 的 Package 。 第 三 個 好 處 是 使 用 Package 就 像 是 使 用 DLL 一 樣

21、 , 主 程 式 可 以 在 需 要 的 時 候 才 載 入 一 個 Package , 在 使 用 完 畢 之 後 可 以立 刻 的 釋 放 這 個 Package , 這 樣 可 以 讓 你 對 於 系 統 資 源 有 更 好 的 控 制 能 力 。 最 後 一 個 好 處 是 使 用 Package 可 以 讓 你 發 展 出 Plug-and-Play 的 模 組 , 當 然 這 需 要 藉 由 結 合 虛 擬 介 面 或 是 虛 擬 類 別 的 功 能 。 藉 由 使 用 Package 和 虛 擬 介 面 的 能 力 , 你 可 以 任 意 的 替 換 應 用 系 統 之 中 的

22、模 組 而 不 會 影 響 系 統 的 執 行 。 這 個 功 能 對 於 許 多 使 用 Delphi 開 發 套 裝 軟 體 的 程 式 師 來 說 是 一 個 非 常 重 要 的 功 能 。現 在 你 應 該 對 於 DLL 和 Package 的 差 異 有 了 基 本 的 瞭 解 , 現 在 是 讓 我 們 看 看 如 何 使 用 Package 的 特 性 解 決 我 們 面 對 的 問 題 的 時 候 了 。 下 一 小 節 就 讓 我們 實 際 的 撰 寫 一 個 範 例 來 證 明 Package 對 於 全 域 變 數 的 處 理 方 式 以 及 使 用Package 的

23、確 能 夠 加 快 應 用 程 式 的 載 入 速 度 。實 際 的 範 例由 於 平 日 我 大 部 份 的 時 間 都 是 使 用 Oracle , MS SQL Server 和 InterBase (許 多 的 讀 者 都 詢 問 我 為 什 麼 不 使 用Sybase 或 是 Informix 做 為 範 例 說 明 , 這 實 在 是 因 為 我 比 較 少 使 用 它 們 , 並 沒 有 其 他 的 意 思 , 所 以 請使 用 Sybase ,Informix 和 DB2 的 讀 者 見 諒 。 不 過 我 相 信 我 們 討 論 的 東 西 都 可 以 使 用 在 這 些 資

24、 料 庫 之 上) 。 在 這 三 個 資 料 庫 中 , Oracle 的 連 結 速 度 一 直 都是 令 我 非 常 頭 大 的 , 因 為 在 這 三 者 之 中 ,Orcale 連 結 資 料 庫 和 開 啟 資 料 庫 表 格 的 時 間 最 久 。 所 以 本 節 的 範 例 就 以 Oracle 資 料 庫 為 範 例 , 看 看 使 用 了Package 之 後 會 不 會 有 任 何 明 顯 的 改 善 。首 先 請 你 先 建 立 一 個 Package , 並 且 在 這 個 Package 之 中 產 生 一 個 資 料 模 組 , 並 且 使 用 Database

25、和 Query 元 件 連 結 到 Oracle 的 資 料 庫 如 圖 六 所 示 。圖 六 存 在 於 Package 之 中 的 資 料模 組 使 用 Database 連 結到 Oracle在 成 功 的 編 譯 了 這 個 Package 之 後 , 再 讓 我 們 設 計 範 例 程 式 的 主 表 格 如 圖 七 一 樣 。圖 七 使 用 公 用 資 料 模 組 的 主 表 格在 主 表 格 中 有 一 個 DataSource 元 件 。 這 個 DataSource 元件 會 在 資 料 模 組 的 Package 載 入 之 後 , 連 結 到 資料 模 組 之 中 的 Q

26、uery 元 件 以 便 顯 示 Oracle 資 料 庫 之 中的 資 料 。 現 在 剩 下 的 工 作 便 是 撰 寫 程 式 碼 載 入 資 料 模 組 Package 和 顯 示 資 料 庫 的 資 料 。首 先 在 主 表 格 啟 動 時 , 它 必 須 在 FormActivate 事 件 處 理 函 數 中 載 入 資 料 模 組 Package 。 它 呼 叫 LoaddbPackage 這 個 程 序 。procedure TMainForm.FormActivate(Sender: TObject); beginLoaddbPackage;end;LoaddbPackag

27、e 是 真 正 負 責 載 入Package 的 程 序 。 它 在 一 個 try except 程 式 區 塊 中 呼 叫 Delphi 的 LoadPackge 函 數 載 入 指 定 名 稱 的 Package 。 這 個 函 數 在 成 功 執 行 後 會 回 傳 一 個 Package 的 handle 值 。 我 們 的 程 式 必 須 儲 存 這 個 handle 值 以 便 稍 後 使 用 它 , 並 且 在 最 後 藉 由 這 個 handle 值 釋 放 載 入 的 Package 。 如 果 呼 叫 LoadPackage 成 功 的 話 , 程 式 就 呼 叫 Loa

28、dDataModule 從Package 中 取 得 前 面 介 紹 的 資 料 模 組 , 否 則 在 except 程 式 區 塊 中 ShowMessage 會 顯 示 發 生 錯 誤 的 原 因 。procedure TMainForm.LoaddbPackage;begin /我們必須載入資料庫Package以便連結到資料庫tryaDBConnect := LoadPackage(DBPackages);LoadDataModule;excepton E : Exception dobeginMessageBeep(Word(-1);ShowMessage(E.Message);Ap

29、plication.Terminate;end;end;end;在 LoadDataModule 中 我 們 必 須 先 從 資 料 模 組 Package 之 中 取 得 資 料 模 組 的 真 正 Meta-Class 名 稱 , 然 後 使 用 這 個 Meta-Class 建 立 真 正 的 資 料 模 組 物 件 。 所 以 LoadDataModule 一 開 始 會 呼 叫 GetClass 向 Windows 取 得 特 定 類 別 名 稱 的 Meta-Class 。 而 GetClass 傳 入 的 參 數 TConcreteDataModule , 便 是 前 面 我 們

30、 建 立 的 資 料 模 組 的 真 正 的 類 別 名 稱 。由 於 一 個 獨 立 的 EXE 要 能 夠 取 得 Package 之 中 的 Meta-Class 必 須 使 用 指 定 的 類 別 名 稱 。 所 以當 你 在Package 中 撰 寫 任 何 的 類 別 時 , 你 必 須 確 定 這 個 類 別 名 稱 在 所 有 Delphi 或 是 應 用 程 式 載 入 的 Package 中 都 是 唯 一 的 。 否 則 如 果 有 在 所 有 載 入 的 Pakcage 中 有 相 同 的 類 別 名 稱 時 ,Delphi 或 是 應 用 程 式 會 產 生 一 個

31、例 外 。在 成 功 的 從 Package 取 得 了 Meta-Class 之 後 , 你 就 必 須 使 用 這 個 Meta-Class 產 生 真 正 的 資 料 模 組 物 件 。 請 注 意 在 下 面 的 程 式 碼 中 , 我 們 使 用 了 強 制 型 態 轉 換 把 TComponentClass 的 物 件 轉 換 為 TDataModule 的 物 件 。在 建 立 了 TDataModule 物 件 之 後 , 我 們 就 可 以 一 一 的 搜 尋 資 料 模 組 之 中 的 元 件 並 且 找 到 我 們 需 要 的 Query 元 件 , 並 且 把 主 表

32、格 中 DataSource 的 DataSet 特 性 值 設 定 為 找 到 的 Query 元 件 。procedure TMainForm.LoadDataModule;var iCounter : Integer;begin Note that TApplication owns this form and thus it must be freed priorto unloading the package dataModuleClass := GetClass(TConcreteDataModule);if dataModuleClass nil thenbeginadmGlobal :=TDataModule(TComponentClass(dataModuleClass).Create(Application);for iCounter := 0 to admGlobal.ComponentCount - 1 dobeginif UpperCase(admGlobal.ComponentsiCounter.ClassName) = TQUERY thenbegin

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2