讨论:win2000+sql2000开发中大型系统到底是用二层好还是多层好!(100分)

Z

zhanggeye

Unregistered / Unconfirmed
GUEST, unregistred user!
我的意思是说,delphi的几种线程控制机制只是对api进行封装。和用api是一样的。
 

捡垃圾去上网的人

Unregistered / Unconfirmed
GUEST, unregistred user!
三层结构的升级如果不是原来开发这个程序的人的话很麻烦,知道吗!!!!!
二层结构的进一切升级开发虽然速度不及三层,但安全
 
V

vcanddelphi

Unregistered / Unconfirmed
GUEST, unregistred user!
我在这里非常感谢大家的发言:(虽然我不是版主):
我感谢版主,开出来空间让我们讨论。也感谢回答我的问题的人,特别是“沙隆巴斯的主人”我认为,你真是个高手,有机会可一定要多多指教啊!!!!
我现在感觉大家讨论的问题已经超出了版主要讨论的问题的范围了。

最后的结果,我认为,大家都有自己的想法,要是一再让认为两层好的人,转变认为三层好,可能不是一时的时间能转变的,反之也是如此。

所以我建议版主,也该把这个问题结束一下了,如果想在讨论,可以以后在开一个空间,让大家讨论,并切,开的空间要讨论的范围广一点,不要只局限与,二,三之争,争来争去,我们大家都是为了技术的提高把了。

这只是我个人的观点,不知大家是否同意?
并且,我也希望想“沙隆巴斯的主人”之类的高手,不要走开,我们还要向你们请教呢!
我在此再此感谢你们!!!!!!!
 
H

hnzcg124

Unregistered / Unconfirmed
GUEST, unregistred user!
实践是检验真理的唯一标准!!!!![8D]
 
M

merry_bip

Unregistered / Unconfirmed
GUEST, unregistred user!
楼上说的是
!!!
 
G

guxizhw

Unregistered / Unconfirmed
GUEST, unregistred user!
本来就路过么,探了个头进来,发现吵的好热闹
发表点意见

我就一菜鸟,但是这篇帖子势必会影响我的将来,因为我的毕业论文将要用到里面的很多东西。我一直认为3层优于2层,为什么,因为书上说的。而我在开发的erp系统,却是一个,嗯,准确的说算一层吧,所有工作都必须客户端完成,server端除了可以存数据之外,什么都不会干。而我的boss要叫我在论文中,写,基于组件的3层大型erp系统开发。
tnnd,我差点崩溃,我突然发现,这帖子给我很大的启发,原来2层不是象书上说的一无是处,2层有2层的优势,那就是开发快速,简单!哈哈,同3层相比,在小型系统里面是很有优势的(其实我做的系统只有10多个人用吧,很不得了了)

没有想到dfw里面居然是以2层更优为主流的,让我很开心,这样我在论文里面可以不用昧良心的写我的3层系统如何如何牛x……这就是中国的教育

沙龙巴斯的主人绝对一高手,一人力撑3层,感觉在后面的论战中占据优势~~希望能有更多精彩的言论。

我该重新考虑一下了,诚实才是一个人最优良的品德,论文里我会如实的写上我是用的两层开发,为什么不采用3层,因为我的boss,项目经理就没有指导我这样做,当然2层有2层的优势……然后就是大家的论战,谢谢了啊
哇哈哈哈
 
W

wwssdd2000

Unregistered / Unconfirmed
GUEST, unregistred user!
多层比较好,具体如下:
基于sql server 2000的B/S模式管理信息系统的设计与实现
作者:魏书堤(联系电话:13087246948 电子信箱:WWSSDD2000@163.COM 联系地址:衡阳师范学院计算机系 邮编:421008)

摘 要:文章探讨了利用Delphi开发基于sql server2000数据库服务器的B/S模式的MIS系统。描述了用Delphi开发客户、服务器应用程序的关建技术。

关键词:B/S、Delphi、SQL SERVER2000、ODBC、DataSnap、ActiveForm
Design and Implementation of MIS of B/S Model Base on The SQL SERVER2000
WEI Shu-di
(Computer Department,Hengyang Normal University,Hengyang Hunan 421008)
Abstract:We research the method for development of MIS of B/S model base on The SQL SERVER2000,In this paper,We given a detail introduction of key technologies about developing client/server applications with the Delphi.
Key words: B/S、Delphi、SQL SERVER2000、ODBC、DataSnap、ActiveForm
1. 引言
传统的MIS一般建立在客户机/服务器(C/S)模式之上,这种结构一般都采用胖客户的开发模式,MIS的开发一般着重于客户端开发, 服务器端则以大型DBMS作后台,提供数据管理服务。这种模式随着企业规模的日益扩大,应用程序的复杂程度不断提高, 暴露出许多问题:
(1)维护、升级非常不方便。如果应用程序要升级, 则要将客户机方的软件逐个升级,每个客户机上的应用程序都需要单独维护。
(2)对客户端软、硬件要求较高。由于很大一部分的管理功能在客户端实现,使得对客户端的要求随之较大。尤其是软件的不断升级, 对硬件要求不断提高,增加了整个系统的成本。
(3)缺乏开放性,较难以与Internet连接。系统之外的用户难以访问系统内的资源, 系统内的客户也不便访问系统外资源,在整体上如同网络外的孤点。
(4)单向性。信息的内容和形式比较单一,信息的流向基本上是由下向上单向流动,下层只为上层提供信息和信息处理,难以及时得到上层的信息及一些需要的信息处理结果。既限制了上层通过MIS发布信息、履行管理职能的活动,又不能充分发挥下层使用MIS的积极性。

而企业规则的变化会使得管理信息系统做很大的改变。对于软件项目来说:由于时限、硬件环境的变化,对它的扩展和维护会越来越不现实。尤其是互连网的发展,使得B/S模式成为MIS系统开发模式发展的必然。象电子配送,网上购物。本文将介绍使用Delphi和SQL SERVER2000进行B/S方式的开发。
2. B/S的基本结构
B/S结构,即Browser/Server(浏览器/服务器)结构,是随着Internet技术的兴起,对C/S结构的一种变化或者改进的结构。在这种结构下,用户界面完全通过WWW浏览器实现,一部分事务逻辑在前端实现,但是主要事务逻辑在服务器端实现,形成所谓3层结构。B/S结构,主要是利用了不断成熟的WWW浏览器技术,用通用浏览器就实现了原来需要复杂专用软件才能实现的强大功能,并节约了开发成本,是一种全新的软件系统构造技术。随着计算机技术的发展,这种结构更成为当今应用软件的首选体系结构。显然B/S结构应用程序相对于传统的C/S结构应用程序将是巨大的进步。三层B/S结构将应用的三个部分明确的分开:表示部分、应用逻辑部分、数据访问部分。这三个部分在逻辑上独立的分开,分别加以实现,称之为:客户端、应用服务器、数据库服务器。而在客户端和应用服务器之间加入一个WEB服务器,就形成了一种特殊的B/S结构——Browser/Server,只在客户端安装一浏览器软件即可。客户端使用Internet Explore时,就可以让Internet Explore变成为能够处理数据的应用系统。B/S结构如图1所示:

图1 B/S结构示意图

一般情况下,为了能够适应客户机数目的增加和应用处理负荷的变动,将应用服务器和数据库服务器分开来,这样企业在增加新的应用逻辑时,可以增加新的应用服务器。这样,有多个应用服务器同时运行时还有负载平衡能力。
3. B/S 各部分的功能
(1) 客户端浏览器
Browse是用户与应用服务器的接口部分,负责用户与应用程序之间的交互。用来访问ActiveForm 组件的首页,并在第一次使用ActiveForm时自动将其下载到客户端。程序利用ActiveForm接受用户的输入、请求,发送到应用服务器端,应用服务器将处理结果以适当的形式返回给用户。
(2) Web服务器
Web服务器是用来连接IE浏览器和应用服务器的,是应用服务器的辅助部分,为了保证数据的安全性,建议在web服务器上加载防火墙。
(3) 应用服务器
应用服务器是应用逻辑处理的核心,它是具体业务的实现。所有的应用逻辑和企业规则都写成企业对象,放在应用服务器端。这样可实现真正的瘦客户端。为了减轻网络负载,提高执行速度,应用服务器和客户端之间的数据交往要尽量简洁,客户端将请求信息发送给应用服务器,应用服务器在和数据库服务器之间交互后,将处理的结果返回给客户端。
应用服务器一般和数据库服务器有密集的数据交往,应用服务器向数据库服务器发送SQL请求,数据库服务器根据SQL语句对数据库进行操作,然后将所的结果全部返回给应用服务器。这样二者之间的数据交换量很大,为了避免因负载过大影响网络速度,一般要将应用服务器和数据库服务器二者共存在一台专用服务器上。
企业如果因某种原因使得某些企业规则发生变化,只要在应用服务器上改动一下即可,客户端不受影响。如果需要增加新的企业规则或者是企业应用逻辑变的复杂,可以增加新的应用服务器,它可以与原来的应用服务器在同一台主机上或者是在不同的主机上。
(4) 数据库服务器
数据库服务器一般是基于T_SQL语言,并具有客户机/服务器结构的关系型数据库管理系统。主要用来完成数据的存储、响应客户数据的请求、数据的引用完整性约束及用户并发的控制等。比如:SQL SERVER2000数据库服务器。
4. 多层B/S结构的优点
(1) 具有可伸缩性
因为多层结构在硬件实现上是相互独立的,各部分可以各自选择与自己处理负荷和特性相适应的硬件,而不受其它部分的影响。在开始可以将应用服务器、数据库服务器与WEB服务器放在一起,加载防火墙,随着企业规则的增加和应用的发展,可以追加一台或多台主机作为各种服务器。
(2) 可维护性强
传统的C/S体系结构虽然采用的是开放模式,但这只是系统开发一级的开放性,在特定的应用中无论是Client端还是Server端都还需要特定的软件,没能提供用户真正期望的开放环境;B/S结构则不同,它的前端是以TCP/IP协议为基础的,企业内的WWW服务器可以接受安装有Web浏览程序的Internet终端的访问,作为最终用户,只要通过Web浏览器,各种处理任务都可以调用系统资源来完成,这样大大简化了客户端,减轻了系统维护与升级的成本和工作量,降低了用户的总体拥有成本(TCO)。
  软件系统的改进和升级越来越频繁,B/S架构的产品明显体现的更方便的特性。无论用户的规模有多大,有多少分支机构都不会增加任何维护升级的工作量,所有的操作只需要针对服务器进行,如果是异地只需要把服务器连接上网即可立即进行维护和升级,这对人力、时间、费用的节省是相当惊人的。   
企业的规则和企业逻辑都放在应用服务器上,因此当企业规则或企业的逻辑发生变化时,只需在应用服务器端做修改即可,一处变处处变,使得维护工作量减少,维护费用降低。此外,由于各层是相互独立的在程序开发阶段可以实现并行开发,另外还可以大大提高数据的安全性;客户端只关注用户访问界面,并与其它客户共享相同的数据库访问模块,从而使客户端大大变瘦,实现瘦客户端,维护起来相对简单。B/S 的多重结构,要求构件相对独立的功能, 能够相对较好的重用。
(3) 安全性
对二层结构来说,一方面企业的事务处理逻辑包含在客户端应用程序中,未经授权的用户很容易通过应用程序侵入系统,另一方面,授权的用户拥有连接数据库的权限,他可以使用自己的数据库访问工具连接到数据库对其进行操作,他们对系统的安全带来很大的隐患。对多层B/S结构来说,企业的应用逻辑和企业的规则大部分放在应用服务器端,最终访问数据库大多也是由应用服务器来完成,对用户来说是透明的。客户端不能直接访问数据库服务器,另外防火墙的使用,有效的防止用户的非法入侵,这样保证了系统的安全性。同时,企业模型运行在独立的计算机上,可以对企业模型、企业规则做更加严格的保护。
(4) 分布式处理能力,更能适应Internet发展趋势
分布式处理能力:新一代的管理软件系统是超大规模的,它将处理在地域上分散的部门间的事务与数据。将不再是集中在同一局域网络服务器上的系统,因此支持分布式应用和分布式数据库将是未来管理软件的一个特征。 随着Internet的发展,企业的运作越来越离不开网络。采用多层的B/S模式,既能提高企业的工作效率,又能适应Intenet发展的需要。
(5) 对事务进行更有效的管理
所有在客户机上对于企业模型的操作都反映到应用服务器上,可以统一的对所有事件进行管理,并进行记录,灵活地生成系统日志。
5. DataSnap 多层应用程序
DataSnap 服务器是在(服务器)机器上运行并连接到 DBMS 的应用程序,对于一个 DataSnap 服务器,您可以有多个 DataSnap 客户机,它们仅与 DataSnap 服务器连接,而不必与 DBMS 本身连接。实际上,DataSnap 客户机甚至不必知道它(通过 DataSnap 服务器)连接到了哪个 DBMS。该方法使 DataSnap 客户机变成所谓的瘦客户机,因为客户机机器上不需要特定于数据库的驱动程序。而且 DataSnap 服务器甚至根本不必更改客户机就可以从一个 DBMS 迁移到另一个 DBMS。
6. 实例实现
多层B/S结构有很多实现的方式,最直接的方式就是选用支持三层C/S结构的数据库前台开发工具,例如Delphi 6.0。考虑到所有客户端界面的一致性和Internet的应用,采用多层的Browser/Server结构来实现,形成浏览器—Web服务器—应用服务器—数据库服务器的结构,这种结构实质上是对三层结构的扩充,形成多层结构。下面介绍一下使用Delphi 6.0的ActiveForm技术来实现扩充三层结构的方法。
开发一个多层结构的应用程序的基本步骤如下:先建立一个应用服务器程序,在应用服务器运行着的前提下,建立客户端应用程序。最后使用Delphi6.0的ActiveForm技术对客户端应用程序进行包装,生成一个OCX控件和标准的HTML文件。然后通过Web服务器将HTML文件链接到公司或者是局域网的主页上,就可以通过浏览其来完成客户端的所有操作了。
(1) 配置ODBC数据原名,建立数据库别名
先使用系统的控制面板或者是系统的管理工具ODBC32来设置ODBC数据源名,选择数据库的驱动程序为SQL SERVERE,再选择指定的数据库;Delphi的BDE会根据ODBC数据源名来建立一个数据库别名,跟数据库进行连接。
(2) 建立应用服务器程序
首先用File|New…打开选项板,在选项板上的Multitier选项页上,选择Remote Data Module,然后点击确定按钮。在CoClass栏内填写你的远程数据模块的名称,在Intacing和Threading Model栏内的名称选默认选项,点击确定按钮。这时会有一数据模块出现,您可以在数据模块里面加入Ttable、Tquery、Tdatabase和TdatasetProvider控件,然后将Tdatabase与数据库相连,将Ttable或Tquery控件与数据库中的表或查询数据集相连,最后把TdatasetProvide和数据集控件连接起来。在应用服务器端Tprovider控件提供Iprovider接口,用于与远程客户端的数据信息交互。把做成的工程文件以DataSnapServer存盘,运行一下,系统会自动注册应用服务器,这样一个最基本的应用服务器就做成了。
(3) 建立DataSnap客户端应用程序
DataSnap 客户机应用程序可以是任何类型的应用程序 — 从常规的 GUI 到 Web 服务器。因为 DataSnap 服务器内部的远程数据模块是 COM 服务器,所以您的客户机类型只限于 Windows 客户机。构建基本 DataSnap 客户机的步骤如下:
1. 通过使用 File > New Application,再构建一个常规应用程序 — DataSnap 客户机。将主窗体保存在 ClientForm.pas 中,将应用程序工程保存在 DataSnapClient.dpr 中。
2. 使用 Component Palette 的 DataSnap 选项卡中一个可用的连接组件,建立从 DataSnap 客户机到 DataSnap 服务器的连接。可用选项是:TDCOMConnection、TSocketConnection 和 TWebConnection。第一个选项将 DCOM 用作通信协议;第二个选项使用 TCP/IP 套接字;最后一个选项使用 HTTP。注:第二个和第三个解决方案需要额外软件(在 DataSnap 服务器机器上):TCP/IP 套接字连接需要 Borland Socket Server,而 Web 服务器(如 IIS)和 httpsrvr.dll ISAPI DLL 是允许 Web 连接工作所必需的。目前,使用 TDCOMConnection 组件(参考联机帮助,以获取有关使用其它通信协议的详细信息)。
3. 将 TDCOMConnection 组件放入 DataSnap 客户机窗体中,打开 ServerName 特性的下拉组合框。这应该显示一个列表,其中包括了所有已注册的 DataSnap 服务器及其可在您机器上使用的远程数据模块(可能只有一个:DataSnapServer.RemoteDataModuleDB2)。选择 DataSnapServer.RemoteDataModuleDB2,将 Connected 特性设置为 True,以验证是否可以从 DataSnap 客户机应用程序启动 DataSnap 服务器。将 Connected 重新设置成 False。注:对于和远程 DataSnap 服务器的连接,还需要指定 TDCOMConnection 组件的 ComputerName 特性(如果没有指定,您将与本地主机(localhost)本身通信)。
4. 对于 DataSnap 服务器端的四个 TSQLDataSet 组件,分别在客户机端放入一个 TClientDataSet 组件。将它的 RemoteServer 特性连接到 DCOMConnection1(构成 DataSnap 服务器网关的连接组件)。接下来,打开其 ProviderName 特性的下拉组合框,选择table1或query1。当激活 TClientDataSet 组件时,它们将使用 TDCOMConnection 组件来连接至 DataSnap 服务器,并从相应的 TDataSetProvider 组件请求(和接收)其数据。这十分方便。
5. 通过将四个 TDataSource 组件放在窗体上,并组件连接到对应的 TClientDataSet 组件(当然具有相应的名称),以完成 DataSnap 客户机应用程序。
在客户端,有TDCOMConnection控件与应用服务器相连接,TClientDataSet为用户提供数据集,与二层结构中的Ttable、Tquery控件的作用相类似。各个控件之间的关联关系如图2所示:

图2 控件之间的关联关系

(4)使用ActiveForm进行包装
① ActiveForm事实上也是一种ActiveX组件,只是ActiveForm本身也是一个ActiveX的Container对象。这个意思是说ActiveForm之中还可以包含其它的组件,而ActiveForm和它包含的组件可以整个变成一个OCX类型的组件,再使用于Internet Explore这个COM/ActiveX container应用程序之中。因为ActiveForm可以包含任何Delphi中的VCL组件,所以程序员可以建立一个拥有数据感知能力的ActiveForm组件。而且这个ActiveForm组件可以使用于任何一个支持ActiveX的开发工具之中,当然也包含使用于IE浏览器中。由于ActiveForm可以具有处理数据的能力,所以当它使用于IE浏览器时,就可以让浏览器变成可以处理数据的应用系统。这样,我们就可以利用ActiveForm的这一特点开发多层的应用系统,而且客户端只需要安装IE浏览器而不需要安装任何的数据库引擎和ODBC驱动程序以及任何BDE别名和ODBC数据来源设定的数据库应用程序。
在包装前,先建立一个ActiveForm的项目。首先在Delphi中关闭所有的项目,接着选择File|New于New Item对话框中选择建立ActiveForm,此时Delphi会弹出一对话框显示有关本ActiveForm的信息,在ActiveForm Wizard对话框中必须输入这个ActiveX组件的名称。此外还有一些选项要程序员选择,在使用ActiveForm时,最好将版本信息选项选中,因为版本信息可以让程序员控制客户端ActiveForm的新旧版本,又是IE决定是否动态的下载ActiveForm到客户端的重要依据。
② 在产生了空白的ActiveForm窗体之后,请设定这个窗体的长和高与客户端应用程序的主窗体的长和高相同,然后拷贝原先客户端应用程序项目的所有档案到ActiveForm项目的目录之中。
做完以上工作后,就需要编写一些代码了。先在ActiveForm 的程序单元中Users客户端的主窗体。然后在ActiveForm中声明一个变量,这个变量是客户端主窗体类别的对象变量,如果客户端主窗体类别的对象是Tform,下面的代码是声明主窗体的对象变量:
FMainForm:TForm;
接着为ActiveForm建立OnCreate事件处理函数,并且在OnCreate事件处理函数中编写如下的程序代码:
Procedure TActiveForm.ActiveFormCreate(Sender: TObject);
Begin
FmainForm:=TForm.Create(Self);
FMainForm.Parent:=Self;
FmainForm.Align :=alClient;
FmainForm.BorderStyle :=bsNone;
FmainForm.Visible :=True;
End;
最后再编写OnDestroy事件的函数,OnDestroy事件的函数的代码如下:
Procedure TActiveForm.ActiveFormDestroy(Sender: TObject);
Begin
FmainForm.Free;
End;
我们在做完以上工作后,就可以编译这个ActiveForm项目。等编译通过,说明我们的ActiveForm组件已经可以使用了。
(3) ActiveForm项目完成后还要进行对其分发。在集成开发环境中选择Project|Web Deployment Options…弹出一对话框,其中Target Dir是ActiveForm分发的目的地址,HTML Dir是存放HTML首页档案的地址,Target URL是此ActiveForm组件位于HTML首页中Codebase tag的位置,这三项必须填写好。此外,下面的选项信息有一些最好也要选种例如:Auto incement release number和Include file version number选项。这是用来自动增加版本信息的。
在完成上面的工作后,就可以选择Project|Web Deploy开始分发ActiveForm组件到指定的位置,如果不出错误,我们就可以看到一个HTML首页的文件。把该文件连接到公司的主页上即可使用。
7. 结束语
随着Internet/Web技术的兴起,以B/S模式为基础通过浏览器访问数据库的新型MIS系统将成为当前研究的热点。而用ActiveForm技术进行包装与分发,使得整个开发过程变的更加简便,可操作性更强,升级、维护更加快捷。


参考文献:
1、张龙卿编著 《Delphi 6 深入编程技术》北京希望电子出版社
2、李维编著 《Delphi 5.x分布式多层应用系统篇》 机械工业出版社
3、Charlie Calvert 著 《Delphi 5编程技术内幕》 机械工业出版社

第一作者 联系地址 邮 编 省 市 电 话 E-mail 稿件名称
魏书堤 衡阳师范学院计算机系 421008 湖南、衡阳 13087246948 WWSSDD2000@163.COM
基于sql server 2000的B/S模式管理信息系统的设计与实现

附:作者简介
魏书堤(1969),男,湖南衡阳人,工程师,主要研究方向:数据库的网络应用与研究。
 

Unregistered / Unconfirmed
GUEST, unregistred user!
討論問題的目的在大家共同進步﹐不要搞傷和氣。

看了你們的發言﹐我覺得可悲﹗好多軟件商的老板不會軟件﹐他卻能做到軟件的領頭人地步﹐可以可見少隆巴斯的主從是一個絕對的高手﹐不知現在有沒有買車﹖


想大家共同進步﹐就寫點經驗出來﹐教大家如何寫三層的模式﹐以及中間層的客戶層之間有什么聯系﹐

最好是把這個代碼全寫出來﹐這才叫英雄﹗
 
T

tranke

Unregistered / Unconfirmed
GUEST, unregistred user!
很好的帖子,在此感谢以上各位兄台的争论,从而我们这些旁听生能够得到很大的启发!
谢谢大家,更应该谢谢大富翁提供了这么优秀的论坛来让我们学习!
 
L

liuxiangsoft

Unregistered / Unconfirmed
GUEST, unregistred user!
請有三層經驗的朋友寫几個例程出來﹗
 
L

liuxiangsoft

Unregistered / Unconfirmed
GUEST, unregistred user!
to :proman!

以下是你貼出來的代碼﹕

使用TCriticalSection就可以做到。
下面是我的连接池的代码,我比较简单,还没有做计时释放的工作。

constructor TConnectionPools.Create;
begin
FConnList := TList.Create;
FCriticalSection := TCriticalSection.Create;
FTimeout := 5000;
FMaxCount := 15;
FSemaphore := CreateSemaphore(nil, FMaxCount, FMaxCount, nil);

end;

function TConnectionPools.CreateNewInstance: TADOConnection;
var
p: PRemoteConnection;
begin
Result := nil;
FCriticalSection.Enter;
try
New(p);
p.Connection := TADOConnection.Create(nil);
p.Connection.ConnectionString := ConnectionString;
p.Connection.LoginPrompt := False;
try
p.Connection.Open(DataBaseUser,DataBasePass);
except
p.Connection.Free;
Dispose(p);
Exit;
end;
p.InUse := True;
FConnList.Add(p);
Result := p.Connection;
finally
FCriticalSection.Leave;
end;
end;

destructor TConnectionPools.Destroy;
var
i: Integer;
begin
FCriticalSection.Free;
for i := 0 to FConnList.Count - 1 do
begin
PRemoteConnection(FConnList).Connection.Free;
Dispose(FConnList);
end;
FConnList.Free;
CloseHandle(FSemaphore);
inherited Destroy;
end;

function TConnectionPools.GetLock(Index: Integer): Boolean;
begin
FCriticalSection.Enter;
try
Result := not PRemoteConnection(FConnList[Index]).InUse;
if Result then
PRemoteConnection(FConnList[Index]).InUse := True;
finally
FCriticalSection.Leave;
end;
end;

function TConnectionPools.LockConnection: TADOConnection;
var
i: Integer;
begin
Result := nil;
if WaitForSingleObject(FSemaphore, Timeout) = WAIT_FAILED then
raise Exception.Create('服务器忙,请稍候再试');
for i := 0 to FConnList.Count - 1 do
begin
if GetLock(i) then
begin
Result := PRemoteConnection(FConnList).Connection;
Exit;
end;
end;
if FConnList.Count < MaxCount then
Result := CreateNewInstance;
if Result = nil then { This shouldn't happen because of the sempahore locks }
raise Exception.Create('Unable to lock Connection');
end;

procedure TConnectionPools.ReleaseLock(Index: Integer;
var Value: TADOConnection);
begin
FCriticalSection.Enter;
try
PRemoteConnection(FConnList[Index]).InUse := False;
//Value := nil;
ReleaseSemaphore(FSemaphore, 1, nil);
finally
FCriticalSection.Leave;
end;
end;

procedure TConnectionPools.SetConnectionString(const Value: string);
begin
FConnectionString := Value;
end;

procedure TConnectionPools.SetDataBasePass(const Value: string);
begin
FDataBasePass := Value;
end;

procedure TConnectionPools.SetDataBaseUser(const Value: string);
begin
FDataBaseUser := Value;
end;

procedure TConnectionPools.UnlockConnection(var Value: TADOConnection);
var
i: Integer;
begin
for i := 0 to FConnList.Count - 1 do
begin
if Value = PRemoteConnection(FConnList).Connection then
begin
ReleaseLock(i, Value);
break;
end;
end;
end;

initialization
ConnectionPools := TConnectionPools.Create;
finalization
ConnectionPools.Free;
end.

我本來是初學三層﹐只是現在越搞越不明白﹐這個池是一個什么樣的概念﹖
你所貼出的代碼太今我大開眼界了﹐結果我找了一下delphi的demo﹐可是你
卻全是搬的那個demo﹐并非出自你手﹗那你對池究竟是怎樣想的﹖你對他的認識有多深﹖你是怎樣理解的﹖


還有﹐我希望這個貼子最好重新再開一貼﹐僂主請三思而行﹐因為這個問題已不再是二層與三層的討論了﹐而是未來發展方向的討倫了﹗
 
P

proman

Unregistered / Unconfirmed
GUEST, unregistred user!
TO:liuxiangsoft
晕,不用把代码再复制一次吧,我本来就是从Delphi的Demo改过来的啊。我在另一个帖子里
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2463683
里就讲清楚了啊,出不出自我手有什么关系吗?我又不是来骗分的,学会不就可以了吗?
至少有人没看过这个Demo是不是。:)
我对池的理解
池就是一个容器,里面存放了各种对象,存放连接的就叫连接池,存放其它对象的就叫其它对象池。
为什么要用池呢?
因为池里存放的对象不需要反复创建啊。
以连接池为例,连接对象的创建相对来说是一个比较慢的过程。
同时数据库对连接也是有一定限制的,那么假如我们有一百个客户端,一般不大可能建立一百个到数据库的连接吧。
而且在实际的应用中,即使有一百个客户端,也不一定每个客户端都不停的在访问数据库是不是,
所以连接池就提供了这样的一种高效的机制。
连接池存放了若干个数据库连接供客户端使用。客
客户端程序(在我的系统里是中间的层的服务器实例)在实际需要访问数据库时从连接池里取得一个连接访问数据库即可,
访问完了立即释放,这样所有需要访问数据库的地方都只是在需要时才取得连接,而这个连接也不需要创建,所以速度很快。同时需要的实际连接数量也大大减少。
与此类似的例子太多了吧,比如对象池啦。
再举个更深动的例子,我们都知道DHCP服务器,DHCP服务器里有个叫IP地址池的东东,也是一个道理啊。
:)
 

沙隆巴斯的主人

Unregistered / Unconfirmed
GUEST, unregistred user!
池技术是由CACHE技术发展而来,是运用非常广泛的提高性能的手段(你CPU里有一级二级CACHE,硬盘上有CACHE。。。),是典型的空间换时间策略。
 
L

liuxiangsoft

Unregistered / Unconfirmed
GUEST, unregistred user!
param:
i am sorry!!!!!!!!!!!!!!!

真對不起﹐我那天搞了一天的池﹐頭都搞大了﹐最后在demo里找到那個東東﹐才舒了一口長氣﹗可是我又有一點不明白﹕我用了池后﹐在type library里所定義的事情和屬性都不能編譯了﹐在池(pool)里提示說沒有定義這個對象。請問﹕

是不是在type libaray里定義的屬性或事情也要在pool再聲明一次﹖如果是﹐那又怎樣聲明呢﹖
 
H

hardware007

Unregistered / Unconfirmed
GUEST, unregistred user!
很多人没有把两层的程序写好,就开始追捧多层
 
C

ChinaBean

Unregistered / Unconfirmed
GUEST, unregistred user!
我喜欢三层,性能不差,扩充性更好
 

沙隆巴斯的主人

Unregistered / Unconfirmed
GUEST, unregistred user!
to liuxiangsoft:
Pool是内部资源,与你接口上的东西没有关系。
 
L

liuxiangsoft

Unregistered / Unconfirmed
GUEST, unregistred user!
to :沙隆巴斯的主人﹗

你要是不信﹐你就到delphi的demo的midas/pooler的下面試試看﹐你在type libaray里加入一個mehtod或是property﹐然后你再編譯看看﹗

能不能幫我解決﹕
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2553450
 
Q

QSmile

Unregistered / Unconfirmed
GUEST, unregistred user!
///“或许大家都看了李维的那几本书,觉得3层就在中间放了个DATASET与PROVIDER,前端用个CLIENT DATASET就是三层了。这样的伪三层大概是大富翁里用得最多的吧。这样的三层确实还不如两层的简单清晰。
但真正的MT体系不是这样的。客户端没有任何的DATASET,没有任何的SQL语句,客户端根本不知道数据库是否存在。它只是通过GUI为用户提供一个与业务对象通讯的接口。”///

非常同意。
如果 客户端还用 Sql 的话,那与两层没有分别了。
 
L

liuxiangsoft

Unregistered / Unconfirmed
GUEST, unregistred user!
自己寫代碼﹖
怎么個寫法﹐是寫在中間層﹐還是客戶端﹐

要是客戶端﹐那不是同他維的為三層是一樣的了﹐
要是寫在中間層﹐那又是一個怎樣的寫法》

http://www.delphibbs.com/delphibbs/dispq.asp?lid=2558768

你們看看﹗

我也是用的ado
 
顶部