<引文1>
KeyLife富翁笔记
作者: 多层应用<组28> - aleyn
标题: 三层应用中的中间层设计经验.(内存篇)
关键字: 中间层,内存
分类: 组笔记专区
密级: 公开
(评分: , 回复: 3, 阅读: 456) »»
作为一个中间件,其要求必须非常严格,毕竟,它是整系统的栋梁,打个比喻来说,它是上有老(SQLSERVER),下有小(客户端系统),打开五个客户端和打开五十个客户端远远不同,在这一点,我们就要讲一讲关於内存方面的设计和注意方面。
合理使用内存就象借钱一样,有借有还,再借不难。如果我们老是申请内存而不释放,系统很快就会当机了。所以,以下几点在设计中间件是大家要注意一下。
1. 主界面尽量简单,仅仅是作为一个监视系统的运作情况即可,无需太花哨或太多功能。
2. 内存用完必须释放,否则你就会看到你的系统所占的内存越来越多,直到当机。
3. 能动态建立的就动态建立。当然“动态”和“整体速度”有点成反比,但它和“整体内存使用”成正比。
4. 把业务规则封装成DLL,动态加载。不同的用户需要的规则不同,同一个用户不需要把所用的规则都同时加载。
5. 指针的本质意义是指本机的内存地址,所以,传送指针意义不大,也有导致其它想不到的事情出现。(包括:Pointer,pChar等等)。
6. 尽量少用第三方控件(Component),尽量不引用无作用单元(UNIT)
7. SQL语句尽量不要包含在系统程序里,最好让它独立出来。再用另一个程序来管理。
8. 中间件的管理可以用另一个程序远程管理。
9. 还是一句,有借有还,再借不难。
大家有什么更好的建议,一起来探讨一下。
2004-05-18 15:04:55 煙灰缸(2282902)
(1)。建立三層之前,我們需要做什麼。
2004-05-18 15:05:38 煙灰缸(2282902)
點示一下,從Client到DataServer,我們做了什麼。
2004-05-18 15:08:11 黑夜(13633497)
先看看,我對三層的認識有沒有錯誤啊!
在中間層建立各種對象,提供接口,然後表示層通過它操作數據?
2004-05-18 15:08:28 煙灰缸(2282902)
對,本質是這樣的。
2004-05-18 15:09:04 煙灰缸(2282902)
從Client端,你的數據是怎麼出去的?
2004-05-18 15:10:57 煙灰缸(2282902)
打個比方,你想找我聊天,那麼,你想用什麼方法和我聊?
2004-05-18 15:11:06 黑夜(13633497)
我連理論都很少啊,公司用的是兩層的,所以不太懂
2004-05-18 15:12:20 煙灰缸(2282902)
就那C/S來講,ADO如何更新數據?
2004-05-18 15:14:25 黑夜(13633497)
我建議取消好了,下次準備好一些再來啊???
多叫上一些人,也回去多看一些這方面的知識?
不知道有沒有打擊了大家的士氣啊???
2004-05-18 15:15:48 Jackey(15677613)
我對三層不怎麼了解,一直在用c/s.但我對三層的認識: 三層提供了一種用戶界面與數據庫之間的轉換,其中 存在一些業務邏輯。這樣作的好處是 1。減少業務邏輯對後台數據庫的依賴, 2。減少前台的工作量。 3。便 于分布式處理。
2004-05-18 15:16:11 Jackey(15677613)
沒人在?
2004-05-18 15:17:15 黑夜(13633497)
可是沒有人有認識啊
先報一下除了煙灰缸還有誰了解的啊???
2004-05-18 15:18:47 Jackey(15677613)
比如,在做三層前先作什麼。在作系統時都是先作規劃。比如:什麼要放在三層。
wait: ERP
2004-05-18 15:19:32 黑夜(13633497)
to 火燄
那裡可以先發表一下意見嗎?
2004-05-18 15:19:48 煙灰缸(2282902)
我們在做三層之前,都是先規畫好數據的定義。
2004-05-18 15:20:30 煙灰缸(2282902)
因為,數據格式可以比較容易改,但改接口就比較麻煩了。
2004-05-18 15:20:31 火燄(269850567)
我提問,
三層,目前有多少實現技術?
2004-05-18 15:20:44 煙灰缸(2282902)
指什麼呢?
2004-05-18 15:21:14 火燄(269850567)
指編程語言和開發工具
2004-05-18 15:21:22 煙灰缸(2282902)
DCOM,SCK, or SNOP
2004-05-18 15:21:25 煙灰缸(2282902)
Delphi
2004-05-18 15:22:01 煙灰缸(2282902)
我開發ERP一般只用Delphi.
2004-05-18 15:22:15 火燄(269850567)
其他語言和工具呢?
2004-05-18 15:22:22 q ? ?r(17427437)
JAVA更實用,不過在國內發展的不太好。
2004-05-18 15:22:30 黑夜(13633497)
delphi中我也只知道這麼三種連接方法
其它語言我不懂
2004-05-18 15:22:32 q ? ?r(17427437)
J2EE
2004-05-18 15:22:42 煙灰缸(2282902)
其它語言少用,工具一般是自己寫的。
2004-05-18 15:22:50 Jackey(15677613)
還是以delphi為例。否則題目又太大
2004-05-18 15:22:59 煙灰缸(2282902)
是。
2004-05-18 15:23:18 Jackey(15677613)
以delphi作的三層組件如corba可以用在java的
2004-05-18 15:23:28 煙灰缸(2282902)
其它的語言我也不懂,我誠實的說。
2004-05-18 15:23:39 火燄(269850567)
也對,那麼Delphi做三層,可以用那幾種實現技術?我也只會Delhpi
2004-05-18 15:24:01 煙灰缸(2282902)
以現在來說,用在Internet上的三層,有多少呢?
2004-05-18 15:24:22 黑夜(13633497)
就是煙灰缸所說的三種羅
2004-05-18 15:24:29 煙灰缸(2282902)
我現在只做局域網的。
2004-05-18 15:24:45 火燄(269850567)
DCOM,SCK, or SNOP?
2004-05-18 15:25:02 Jackey(15677613)
DCOM. SCK SNOP能分別簡介一下?
2004-05-18 15:25:11 煙灰缸(2282902)
其它的其實也同樣道理的,只做一種就可以了。
2004-05-18 15:25:37 煙灰缸(2282902)
DCOM設置很煩,所以我比較少用。我現在用SCK。
2004-05-18 15:25:55 火燄(269850567)
sck是什麼東東?
2004-05-18 15:25:57 煙灰缸(2282902)
所以我講的,多數以SCK為主。
2004-05-18 15:26:05 煙灰缸(2282902)
socketconnect.
2004-05-18 15:26:25 Jackey(15677613)
或以SCK或dcom中例。
2004-05-18 15:26:57 火燄(269850567)
那麼三層的功能如何劃分?
2004-05-18 15:27:01 Jackey(15677613)
以一個業務實例。比如進銷存的進倉業務作探討?
2004-05-18 15:27:03 煙灰缸(2282902)
大家在寫中間層時,如何定義接口。
2004-05-18 15:27:22 煙灰缸(2282902)
以我現在在做的一個項目來講
2004-05-18 15:28:19 煙灰缸(2282902)
有關原碼方面,請大家不要傳得太遠,怕XXX。。。
2004-05-18 15:28:41 黑夜(13633497)
我保證我自己
2004-05-18 15:29:00 火燄(269850567)
不用全部給嘛,給點關鍵的,說明技術就沒有問題了。
2004-05-18 15:29:02 煙灰缸(2282902)
我先找一下我之前寫的一個文章,請等乖。
2004-05-18 15:29:30 煙灰缸(2282902)
打錯字了。
2004-05-18 15:29:46 煙灰缸(2282902)
<引文1>
2004-05-18 15:30:05 煙灰缸(2282902)
這是我在大富翁裡的一個結構圖,請大家先看一下。
2004-05-18 15:31:30 煙灰缸(2282902)
能看懂其中我的建構意圖嗎?
2004-05-18 15:34:06 Jackey(15677613)
給講一下吧
2004-05-18 15:36:05 火燄(269850567)
你那個系統不會是你一個人做的吧?
2004-05-18 15:36:28 煙灰缸(2282902)
不,有5個人,三個人寫,1個寫HELP,1個TEST。
2004-05-18 15:36:52 火燄(269850567)
好復雜哦!而且DLL一堆,你們怎麼調試呢?
2004-05-18 15:37:17 煙灰缸(2282902)
只要規則定好,就不復雜了。
2004-05-18 15:39:21 煙灰缸(2282902)
請大家打個那個PDF文件(业务层(中间层)结构分析图)。
2004-05-18 15:42:16 煙灰缸(2282902)
PDF文檔的右上方的一個例子,請大家留意一下。
2004-05-18 15:43:09 Jackey(15677613)
ole.action:=102.....?
2004-05-18 15:43:53 煙灰缸(2282902)
我的本意是,我不允許程序修改接口,所以只能在其它方面做文章。
2004-05-18 15:44:13 煙灰缸(2282902)
Ole不是記錄,是一個Object.
2004-05-18 15:44:21 火燄(269850567)
ole是什麼?
2004-05-18 15:44:30 火燄(269850567)
param是什麼?
2004-05-18 15:44:53 煙灰缸(2282902)
OLE的作用是將CLIENT的數據轉成OleVariant.
2004-05-18 15:45:13 黑夜(13633497)
忽略了還有一個GetData函數
2004-05-18 15:45:20 Jackey(15677613)
不允許程序修改接口?(clien程式還是?)
2004-05-18 15:45:34 煙灰缸(2282902)
Ole.Action=102的意思是,讓Midas執行102規則。
2004-05-18 15:45:56 煙灰缸(2282902)
是中間層的接口。
2004-05-18 15:45:59 火燄(269850567)
對象怎麼用sck傳送?
2004-05-18 15:46:40 煙灰缸(2282902)
不是傳Object,是傳OleVariant.
2004-05-18 15:46:50 煙灰缸(2282902)
請參看上面的。
2004-05-18 15:46:54 火燄(269850567)
但你說ole是對象啊。
2004-05-18 15:47:05 煙灰缸(2282902)
Ole是對象。
2004-05-18 15:47:32 火燄(269850567)
那中間層怎麼接收這個對象呢?
2004-05-18 15:47:39 黑夜(13633497)
將對象轉換為OleVariant.
2004-05-18 15:47:49 煙灰缸(2282902)
我的意思是,數據從Client出去之前,先經過Ole轉成OleVariant.
2004-05-18 15:48:25 Jackey(15677613)
也就是說,數據轉換在client已完成?
2004-05-18 15:48:32 煙灰缸(2282902)
是。
2004-05-18 15:48:44 煙灰缸(2282902)
中間層不用把它轉成對象。
2004-05-18 15:49:14 煙灰缸(2282902)
而是用中間層的Ole去接受它。
2004-05-18 15:49:15 Jackey(15677613)
中間層只處理接到的OleVariant.
2004-05-18 15:49:25 煙灰缸(2282902)
對,Jackey講對了。
2004-05-18 15:49:55 煙灰缸(2282902)
這樣的話,任何類型的Param都可以處理了。
2004-05-18 15:50:05 火燄(269850567)
多個參數的時候,sck是怎麼傳送的?
2004-05-18 15:50:32 煙灰缸(2282902)
就是用OLE來轉換啊,它的Param就是這個功能。
2004-05-18 15:51:28 Jackey(15677613)
sck只傳送OleVariant. 至于OleVariant是什麼不用關心,它只提供了一個通道. 是否?
2004-05-18 15:51:43 火燄(269850567)
中間層接收到數據後,需要分解參數麼?
2004-05-18 15:52:08 煙灰缸(2282902)
是。
2004-05-18 15:52:38 煙灰缸(2282902)
讓OLE分解就可以了。
2004-05-18 15:53:02 煙灰缸(2282902)
下屬動態規則不用去關心這些。
2004-05-18 15:55:06 煙灰缸(2282902)
還有一個前期要想的是
如果Client正在運行中,你用更新規則,怎麼辦?
2004-05-18 15:56:17 煙灰缸(2282902)
請大家先討論,看看意思是不是差不多的。
2004-05-18 15:57:11 煙灰缸(2282902)
Jackey,你先來好嗎?
2004-05-18 15:57:44 Jackey(15677613)
加個異常處理? 在client檢測Msg?
2004-05-18 15:58:00 煙灰缸(2282902)
黑夜呢?
2004-05-18 15:58:26 黑夜(13633497)
慚愧,不太懂,
2004-05-18 15:58:40 火燄(269850567)
我覺得應該運行的時候鎖住。運行完畢再更新
2004-05-18 16:00:08 煙灰缸(2282902)
意思差不多,但我的做法是,規則更新時,規則管理器通知服務層,服務層鎖住規則
2004-05-18 16:00:08 Jackey(15677613)
如果這樣,Msg的生成在哪? 在接口中作個通用的處理方式?
2004-05-18 16:00:56 煙灰缸(2282902)
一旦CLIENT訪問此規則時,服務層通知CLIENT,規則正在更新。
2004-05-18 16:01:04 火燄(269850567)
你鎖規則?那正好有用規則,你鎖了怎麼辦?
2004-05-18 16:01:16 Jackey(15677613)
對。 規則管理層。類同于進程工廠的處理方式
2004-05-18 16:01:42 黑夜(13633497)
那就先通知消息,正在訪問的繼續,後面的進不來,可以嗎?
2004-05-18 16:01:59 煙灰缸(2282902)
是,正是如此。
2004-05-18 16:02:01 Jackey(15677613)
to fire:
報錯,通用用戶此次操作作廢
2004-05-18 16:02:43 煙灰缸(2282902)
會提示用戶稍等。
2004-05-18 16:02:53 煙灰缸(2282902)
另外
2004-05-18 16:02:58 黑夜(13633497)
那萬一正在訪問的持續了很長時間呢?怎麼辦
2004-05-18 16:03:25 煙灰缸(2282902)
這個就比較難了。
2004-05-18 16:03:35 Jackey(15677613)
可否採用sqlserver的鎖的處理。強制加鎖?
2004-05-18 16:03:51 煙灰缸(2282902)
這樣可能會數據出錯。
2004-05-18 16:04:18 黑夜(13633497)
那就是假設正常使用的都不會持續太長時間?
有時候實際情況不會出現就不用他考慮了吧??
2004-05-18 16:04:20 火燄(269850567)
同步也許是最難處理的
2004-05-18 16:04:48 煙灰缸(2282902)
一般,規則更新都是在試用期,不能在產品正式用時更新主要規則。
2004-05-18 16:05:34 Jackey(15677613)
還有就是定義第統時將規則細化。減少運行時間。
2004-05-18 16:06:07 黑夜(13633497)
那按你這麼說不是不用考慮這個問題了,
我們公司的就是直接停了,然後更新,當然我們只是用兩層
2004-05-18 16:06:49 煙灰缸(2282902)
我的做法是,更新時,規則管理器訪問服務層,並通知預鎖定,服務層查看有幾個進程正在用此規則,並鎖定 ,然後。
2004-05-18 16:08:08 煙灰缸(2282902)
前面操作可以繼續,後面的就鎖住了。
2004-05-18 16:08:58 煙灰缸(2282902)
如果你直接停了服務器,那它和用戶的連接就斷了,這樣不太好。
2004-05-18 16:09:21 Jackey(15677613)
對。
2004-05-18 16:09:47 煙灰缸(2282902)
會導致CLIENT端RPC服務器找不到。
2004-05-18 16:10:29 黑夜(13633497)
可是在試用期間不用這麼考慮吧?
感覺有種多餘,
2004-05-18 16:10:39 Jackey(15677613)
而且會導致數據不安全
2004-05-18 16:11:02 煙灰缸(2282902)
可是,試用期也會有用戶在工作啊。
2004-05-18 16:11:29 Jackey(15677613)
要考慮,因為有時用戶在用的系統會更規則的
2004-05-18 16:11:56 Jackey(15677613)
有時用了一兩年的系統都會改,因為工作流程變了。
2004-05-18 16:12:08 黑夜(13633497)
想想也對,
我都沒有接觸過大的系統,所以,呵呵
2004-05-18 16:12:34 煙灰缸(2282902)
只是試用期間,用戶不多,單個用戶長時間操用一個規則不會太久。
2004-05-18 16:12:46 黑夜(13633497)
我們的差不多半個月就根據客戶修改一點點了,聽起來誇張吧
2004-05-18 16:13:38 黑夜(13633497)
這個問題可以過了,下一個吧
2004-05-18 16:13:40 煙灰缸(2282902)
那大家又是如何做的呢?
2004-05-18 16:14:35 Jackey(15677613)
你是說如何實現這個規則管理器?
2004-05-18 16:16:05 煙灰缸(2282902)
這個寫起來簡單,只要把思路想通就可以了。
2004-05-18 16:16:28 煙灰缸(2282902)
Jackey 是如何更新規則的?
2004-05-18 16:17:07 Jackey(15677613)
我一直在用c.s 的。
2004-05-18 16:17:31 煙灰缸(2282902)
規則都在CLIENT裡?
2004-05-18 16:17:50 Jackey(15677613)
在c.s 我是用一個類工廠的概來實現的。
規則在sql 中的store proc.
2004-05-18 16:17:53 黑夜(13633497)
我也是,更新規則一般就是更新存儲過程
2004-05-18 16:18:02 煙灰缸(2282902)
(2)。建立中間時,我們需要注意什麼
2004-05-18 16:18:18 煙灰缸(2282902)
這樣啊,和我沒用MIDAS之前一樣的。
2004-05-18 16:19:01 煙灰缸(2282902)
還是先大家先來吧。
2004-05-18 16:19:21 黑夜(13633497)
先問一個,一般來說有多少以上用戶的時候才比較需要用三層呢?
2004-05-18 16:19:47 煙灰缸(2282902)
沒有界定。
2004-05-18 16:20:08 Jackey(15677613)
不在用戶多少.而在業務功能。還有對後台有要求是否靈活。
2004-05-18 16:20:51 煙灰缸(2282902)
我和Jackey想法一樣。
2004-05-18 16:22:20 黑夜(13633497)
Jackey 有三層實戰經驗嗎?不一定要實際項目,自己學習編寫什麼的都算啊
2004-05-18 16:22:22 Jackey(15677613)
還是剛才的問題。 建立中間時,我們需要注意什麼
2004-05-18 16:22:41 煙灰缸(2282902)
我先拋出一個問題點,ADO的ConnectionSring在哪裡定?
2004-05-18 16:23:26 Jackey(15677613)
N年前用過。(delphi5)對李維的書抄過。
2004-05-18 16:23:49 Jackey(15677613)
adoconection.
2004-05-18 16:27:46 煙灰缸(2282902)
ConnectionString大家是寫在程序中,還是INI中?
2004-05-18 16:28:16 黑夜(13633497)
程序中?
2004-05-18 16:28:17 煙灰缸(2282902)
指中間層來講。
2004-05-18 16:28:19 Jackey(15677613)
加密的ini
2004-05-18 16:29:12 煙灰缸(2282902)
如果,客戶端有用到多外賬套的話,如何定?
2004-05-18 16:30:12 黑夜(13633497)
在數據庫中存儲,然後讀出
2004-05-18 16:30:52 Jackey(15677613)
多賬套另有設定,存在數據表中,但是多賬套的第一次聯結還是在ini
2004-05-18 16:31:11 煙灰缸(2282902)
呵呵,所見略同也。
2004-05-18 16:31:57 黑夜(13633497)
我的第一次連接是直接在程序中,多賬套就從數據庫中讀取
2004-05-18 16:32:26 煙灰缸(2282902)
我的做法是,服務層只做連接,賬套由CLIENT選定並傳回服務層。
2004-05-18 16:33:52 黑夜(13633497)
那就是說有存在多個用戶同時使用,可是使用的是不同的賬套?
我現在見到的都是一年一個,去年的結了,然後開啟今年的
2004-05-18 16:35:58 煙灰缸(2282902)
答黑夜:是同一個中間層,可用使用不同賬套。
2004-05-18 16:36:49 Jackey(15677613)
實現方法?
2004-05-18 16:37:11 煙灰缸(2282902)
我用不同的DATABASE,你呢?
2004-05-18 16:37:18 煙灰缸(2282902)
我用不同的DATABASE,你呢?
2004-05-18 16:38:36 Jackey(15677613)
能否具體, 我沒有用過此方法.
2004-05-18 16:39:55 黑夜(13633497)
可是我找不到那個帖子的地址了,
2004-05-18 16:39:55 煙灰缸(2282902)
客戶端登錄時,必須先選擇賬套。
2004-05-18 16:40:19 煙灰缸(2282902)
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2614850
2004-05-18 16:41:12 煙灰缸(2282902)
至於賬套的選擇,可以在一個特定的Database中設定。
2004-05-18 16:41:22 Jackey(15677613)
對
2004-05-18 16:42:04 煙灰缸(2282902)
實際了,Client選擇賬套,Midas選擇Database.
2004-05-18 16:43:27 煙灰缸(2282902)
還有一個,用戶打開個多個Client,不同賬套,會不會有影向?
2004-05-18 16:44:12 Jackey(15677613)
在同一個前台程式應不能打開多個賬套
2004-05-18 16:44:39 Jackey(15677613)
但如果用戶開了多個程式,就沒有問題
2004-05-18 16:44:43 煙灰缸(2282902)
如果客戶是要這麼做呢?
2004-05-18 16:45:23 煙灰缸(2282902)
我也只能做到,讓用戶打開不同程序。
2004-05-18 16:45:35 煙灰缸(2282902)
多個程序。
2004-05-18 16:46:17 斜陽(249208513)
打開的多少取決于你服務端和客戶端的規則
2004-05-18 16:46:34 Jackey(15677613)
可以不考慮。因為在同一個程式中開多賬套也會引起用戶使用上的混亂
2004-05-18 16:46:59 煙灰缸(2282902)
並不限定他打用幾個。
2004-05-18 16:47:16 斜陽(249208513)
如果你的服務端保存了客戶端的相關信息,比如說客戶端記錄位置等內容,那麼注定你的應用程序不能服務太 多的人
2004-05-18 16:47:59 煙灰缸(2282902)
客戶端記錄位置等內容是指什麼呢?
2004-05-18 16:48:03 斜陽(249208513)
如果你所有的工作都是一次交互就結束,那麼你怎麼打開都沒有問題
2004-05-18 16:48:49 煙灰缸(2282902)
不同的進程,記錄位置不會相互幹擾的。
2004-05-18 16:48:59 煙灰缸(2282902)
服務層也一樣。
2004-05-18 16:49:56 斜陽(249208513)
你你就會是有多少個客戶端連著你,你就要開啟多少個進程了
2004-05-18 16:50:03 Jackey(15677613)
對。
繼續。對于多賬套的這種處理法我有空試一下.
2004-05-18 16:50:37 斜陽(249208513)
服務器能處理的線程數量可不是無限制的噢
2004-05-18 16:50:42 煙灰缸(2282902)
服務程序就一個,線程就看多少用戶了。
2004-05-18 16:51:16 煙灰缸(2282902)
我也有考 這一點,所以正在想辦法改進。
2004-05-18 16:51:21 斜陽(249208513)
以前不知道這個,結果作的東東就能連10幾個用戶,再多服務器的性能就會直線下降
2004-05-18 16:51:54 煙灰缸(2282902)
你是不是把所有的數據都放在DataModule了?
2004-05-18 16:53:16 斜陽(249208513)
沒太弄明白你說的
2004-05-18 16:53:29 煙灰缸(2282902)
現在我的程序能支持23個用戶同時在線,再多就沒有試用。
2004-05-18 16:54:10 煙灰缸(2282902)
也就是說,你是不是把所有的ADO控件和數據和其它都放在服務層的DataForm裡了。
2004-05-18 16:56:22 斜陽(249208513)
我以前採用的方式是來開了一個類似緩衝池的東東,先創建一些同數據庫的連接,然後來一個用一個,用完了 馬上方入池中,如果池中的都用完了,就動態加大這個池能容納的最多的連接
2004-05-18 16:57:38 斜陽(249208513)
結合中間件技術,最多的時候連接了一百多個客戶端(測試狀態下)服務器還是正常地運行著
2004-05-18 16:58:16 煙灰缸(2282902)
我的做法是,所有的數據控件都動態生成,用完就Free.
2004-05-18 16:58:58 煙灰缸(2282902)
我下次試一個運行幾百個用戶。
2004-05-18 16:59:44 斜陽(249208513)
動態創建的方式在客戶端請求連接的時候會慢一些
2004-05-18 17:00:15 煙灰缸(2282902)
客戶端只要連接一次而已。
2004-05-18 17:00:56 斜陽(249208513)
我現在有點搞不清楚你的三層都是怎麼劃分的了
2004-05-18 17:02:01 煙灰缸(2282902)
你能講講你是如何分的嗎?
2004-05-18 17:02:55 斜陽(249208513)
數據服務器、業務邏輯層和客戶的界面表示層
2004-05-18 17:03:12 煙灰缸(2282902)
我也一樣。
2004-05-18 17:04:28 斜陽(249208513)
一般性的校驗工作都放在客戶部分了,每次客戶端在啟動的時候都對比服務器上相應模塊的版本,如果不一致 就先同步客戶端的軟件
2004-05-18 17:05:09 煙灰缸(2282902)
這是升級吧,請繼續。。。
2004-05-18 17:06:20 Jackey(15677613)
所有的數據控件都動態生成: 包括database? 什麼時候free.database. query可以立時free的?
2004-05-18 17:06:23 斜陽(249208513)
客戶端並不是什麼都沒有,因為客戶端的硬盤有的是地方,怎麼說也是在客戶端直接執行東西快些,況且版本 也不是總升級,哪有天天改業務邏輯的?所以還是很不錯的
2004-05-18 17:07:08 煙灰缸(2282902)
呵呵,所見略同也。N
2004-05-18 17:08:19 煙灰缸(2282902)
答Jackey:規則交回服務層後,服務層轉換數據後,再FREE。
2004-05-18 17:12:34 Jackey(15677613)
也就是說。client取發送了Olevariant. 服務層解析OleVaruant.建立生成database, 建立聯結,根據規則運行 數據。 完成規則後。返問用戶層需要的數據。free database.
2004-05-18 17:12:47 Jackey(15677613)
錯.client層
2004-05-18 17:13:00 煙灰缸(2282902)
我的正是如此。
2004-05-18 17:13:15 斜陽(249208513)
我先聲明一下,我作三層結構開發的時候還使用Nt4.0呢,當時用Delphi5開發的,現在好久不作三層結構的開 發了,要是我說的東西都落伍了,大家可別笑話我啊!
2004-05-18 17:14:08 Jackey(15677613)
to 斜陽:差不多。聽一下煙灰缸的, 他的設計思路很好.
2004-05-18 17:14:39 煙灰缸(2282902)
呵呵,Jackey過獎了。
2004-05-18 17:14:44 Jackey(15677613)
比李維的更成體系。
2004-05-18 17:14:57 風(68187411)
Delphi是用MIDAS
2004-05-18 17:15:05 煙灰缸(2282902)
是啊。
2004-05-18 17:15:38 風(68187411)
原理差不多,只是使用的技術不一樣
2004-05-18 17:15:56 煙灰缸(2282902)
今天的最後一個問題:
2004-05-18 17:16:00 煙灰缸(2282902)
(3)。中間層規則是動態連接的好還是編譯鏈入好。
2004-05-18 17:16:25 Jackey(15677613)
continue..到哪? 如何創建規則管理層.?(還沒有深入).
2004-05-18 17:16:32 斜陽(249208513)
你指的是什麼規則呢?
2004-05-18 17:17:46 煙灰缸(2282902)
建立規則層的問題,我想放在第4課或第5課時講比較合適,大家意思呢?
2004-05-18 17:17:57 煙灰缸(2282902)
規則管理層
2004-05-18 17:17:59 風(68187411)
中間層是商業邏輯層,主要是各種商業對象的組件。
2004-05-18 17:18:11 斜陽(249208513)
我當時作了一個解釋器,用戶可以用腳本語言定義業務流程
2004-05-18 17:18:20 Jackey(15677613)
明白,
2004-05-18 17:18:34 Jackey(15677613)
我認為用腳本好一點。
2004-05-18 17:18:51 煙灰缸(2282902)
我用動態連接庫。
2004-05-18 17:19:09 斜陽(249208513)
一直想作一個Windows風格的定義器,但是沒等實施就離開那個單位了
2004-05-18 17:19:21 風(68187411)
用動態鏈接庫能實現分布式嗎?
2004-05-18 17:19:35 Jackey(15677613)
我現在做的前台都大部分用了腳本,通過數據字典定義前台簡單的規則。
2004-05-18 17:20:05 煙灰缸(2282902)
是可以,我是這樣做的。
2004-05-18 17:20:11 風(68187411)
用動態鏈接庫能實現分布式嗎?是COM組件吧?
2004-05-18 17:20:20 煙灰缸(2282902)
是用到COM。
2004-05-18 17:20:44 煙灰缸(2282902)
基本上用Interface實現。
2004-05-18 17:20:50 風(68187411)
那個應該不稱為動態鏈接庫,叫COM組件。
2004-05-18 17:21:17 煙灰缸(2282902)
因為我是用到COM的思想,但不用COM組件。
2004-05-18 17:21:42 風(68187411)
動態鏈接庫怎麼實現分布式?
2004-05-18 17:22:04 煙灰缸(2282902)
這個說來長了。。。。
2004-05-18 17:22:12 風(68187411)
原理
2004-05-18 17:23:02 煙灰缸(2282902)
大家有沒有看過劉藝老師的DLL Object輸出的文章?
2004-05-18 17:23:50 煙灰缸(2282902)
我是之後才發覺我的做法原來和他的想法一樣。
2004-05-18 17:24:30 煙灰缸(2282902)
建議大家看一看,很有幫助。
2004-05-18 17:24:57 煙灰缸(2282902)
在他的主頁上有。
2004-05-18 17:25:08 斜陽(249208513)
那你遠程的客戶端又是如何同服務器上的組件交互的呢?比如:如何遠程創建服務器上的租間
2004-05-18 17:25:30 煙灰缸(2282902)
後面的沒明白。
2004-05-18 17:25:46 李逸(57440981)
dll的Object輸出有什麼難的呢
2004-05-18 17:26:09 李逸(57440981)
在Delphi或者BCB中RTTI也是同時可以輸出的
2004-05-18 17:26:10 煙灰缸(2282902)
呵呵,老狼來了?
2004-05-18 17:26:15 風(68187411)
如何調用遠程的DLL?
2004-05-18 17:26:26 李逸(57440981)
我一直在,只是沒有時間和大家溝通
2004-05-18 17:26:31 李逸(57440981)
不知道
2004-05-18 17:26:44 李逸(57440981)
遠程的dll需要宿主程序的
2004-05-18 17:27:06 煙灰缸(2282902)
老狼,下一次和大家聊一聊你對VCL的認識,好讓我們見識廣一些。
2004-05-18 17:27:30 斜陽(249208513)
你的業務邏輯不是在服務器上嗎?客戶端要完成一個業務,就必須創建相關的業務對象吧,這些對象應該在服 務器上,要不然就不能實現真正意義上的三層。你是如何讓客戶端創建服務器上的業務組件的?
2004-05-18 17:27:37 風(68187411)
dll必須加載到進程裡運行,所有我不明白aleyn是如何用Dll進行分布式的。
2004-05-18 17:27:55 李逸(57440981)
這個在CSDN上有一個VCL揭密的程序,是動態載入bpl,並且使用其中的組件的
2004-05-18 17:27:57 煙灰缸(2282902)
等等,一時看不完。
2004-05-18 17:28:36 風(68187411)
那也實現不了分布式啊。
2004-05-18 17:28:47 煙灰缸(2282902)
TO斜陽:我的規則是在服務器上。
2004-05-18 17:29:12 斜陽(249208513)
那業務組件在哪裡呢?
2004-05-18 17:29:25 煙灰缸(2282902)
建立規則對象由服務層來做。
2004-05-18 17:29:53 風(68187411)
如果不用DCOM,你是如何實現遠程調用呢?
2004-05-18 17:30:02 煙灰缸(2282902)
裝載和更新則規則管理器來做。
2004-05-18 17:30:35 斜陽(249208513)
概念問題要統一一下,你說的規則是什麼?能否說一下或者舉個例子
2004-05-18 17:30:40 煙灰缸(2282902)
由服務層做就可以啦 。
2004-05-18 17:32:32 煙灰缸(2282902)
例如:Client傳來數據後,由Server確定包中的規則類型,再動太創建規則,將包轉向規則線程。
2004-05-18 17:35:18 風(68187411)
明明有好的技術,為什麼偏要自己定義一種呢?
2004-05-18 17:35:35 李逸(57440981)
自己定義的好
2004-05-18 17:35:38 風(68187411)
DCOM,和Midas都可以實現分布式,為什麼不用?
2004-05-18 17:35:47 煙灰缸(2282902)
我是用MIDAS啊。
2004-05-18 17:35:49 Jackey(15677613)
不是技術問題。 而是實現問題
2004-05-18 17:36:28 斜陽(249208513)
噢,知道了
2004-05-18 17:36:31 煙灰缸(2282902)
可能是大家對概念沒有統一吧。N
2004-05-18 17:37:09 風(68187411)
我開始明白你的架構了。
2004-05-18 17:37:31 煙灰缸(2282902)
又一個明白了,反而我不明白了。B
2004-05-18 17:38:08 風(68187411)
你用Midas,但沒有用到類型庫,而用你自己的Dll,是吧?
2004-05-18 17:38:43 風(68187411)
為什麼不用類型庫?
2004-05-18 17:38:56 煙灰缸(2282902)
因為我用到Interface.
2004-05-18 17:39:28 斜陽(249208513)
我們在討論某個問題的時候首先作的就是先將關鍵的名詞的定義弄清楚,讓每個人都對同一個名詞是一種理解 ,然後再討論業務。所以習慣了,上來就問什麼是你說的“規則”是什麼
2004-05-18 17:40:34 煙灰缸(2282902)
OK,大家都說一下自己的,“規則”是什麼?
2004-05-18 17:40:46 煙灰缸(2282902)
斜陽,你先來.
2004-05-18 17:40:48 Jackey(15677613)
to 斜陽: 一開始其實有個前提作討論,就是煙灰缸的中間層架構圖.
2004-05-18 17:41:11 煙灰缸(2282902)
可能斜陽沒有看到那個圖。
2004-05-18 17:41:20 風(68187411)
規則不是業務邏輯或者稱商業規則嗎?
2004-05-18 17:41:22 Jackey(15677613)
而規則就是指的業務邏輯
2004-05-18 17:41:28 斜陽(249208513)
抱歉,我來晚了,能否告訴我在哪裡能找到
2004-05-18 17:42:32 斜陽(249208513)
在服務端,只有一堆堆的對象和對象之間的交互,我理解的規則就是如何讓這些對象協作來完成一個業務
2004-05-18 17:42:48 煙灰缸(2282902)
對,大家都一樣。
2004-05-18 17:42:50 斜陽(249208513)
不知道理解的對還是不對
2004-05-18 17:43:03 Jackey(15677613)
一樣
2004-05-18 17:43:20 煙灰缸(2282902)
但我的做法是,一個規則就只完成“一個”規則。
2004-05-18 17:43:37 斜陽(249208513)
不清楚
2004-05-18 17:45:02 煙灰缸(2282902)
下次開課我們談什麼好?
2004-05-18 17:45:25 斜陽(249208513)
看了你的圖,我有點明白了
2004-05-18 17:45:31 煙灰缸(2282902)
還是順著我那個圖下去?
2004-05-18 17:46:54 Jackey(15677613)
先按這個圖。再延伸。否則又會多出一些二義性的東東.
2004-05-18 17:47:10 煙灰缸(2282902)
也好。
2004-05-18 17:47:37 煙灰缸(2282902)
要不明天3點左右,再來一課?
2004-05-18 17:55:09 鶴嘯九天(123618972)
而且, 這樣如果數據庫或業務規測變化了,也好修正
2004-05-18 17:55:16 風(68187411)
早幾年也有分布式,不過現在這種技術開始慢慢淘汰了。現在開始用.net和java.
2004-05-18 18:02:37 斜陽(249208513)
但是入果你中間層定義了一個RunSQL接口給客戶調用,那你說算不算三層呢?
2004-05-18 18:03:14 風(68187411)
所以通常我的多層應用程序結構應該是。
界面對象<-->商業邏輯對象<-->數據控制對象<-->數據庫
2004-05-18 18:04:43 風(68187411)
這樣程序才真正的面向對象。這是我們所要求的。
2004-05-18 18:04:59 斜陽(249208513)
那你不定義那個RunSQL不就完事了
2004-05-18 18:05:20 風(68187411)
對,鏈接數據庫應該有數據控制對象來實現。
今天討論的內容大概是:
加深昨天的話題,把一些模糊的概念統一一下。
開課時間:大概是下午3時左右開始。