分布式多层数据库开发简介
delphi提出的midas(multi-tier distributed application services suite多层分布式应用服务器组),是把原来two- tier数据连接放到了服务器端的com组件上,客户端只剩下了执行文件和midas.dll,前台和服务器上的com组件,通过dcom机制互相沟通。
这个多的一层,称为应用程序服务器(application server),或者称为中间件。这种多层分布式工作机制,主要基于这样几点考虑:
1) 减少客户机的维护量,因为前台程序比较简单;
把企业逻辑封装在通用的中间件应用服务器中,不同的客户都可以共享同一个中间层(包括web),而不必每个客户都单独实现企业规则,避免了重复开发和维护的麻烦。由于客户程序相当瘦(这就是现在流行的瘦客户机概念),无论是开发还是发布,都变得简单了。
2) 便于升级,当中间件升级的时候,客户程序可能不需要变化;
3) 实现了分布式数据处理,把一个应用程序分布在几台机器上运行,可以提高应用程序的性能,也可以把敏感部分封装在中间件,为不同的用户设置不同的访问权限,增强了安全性。
4) 减少直接连接数据库的用户数目,减少费用。
在delphi 6.0上,在原来的midas基础上,发展了datasnap技术,在很多细节方面,它提供了原来midas所没有的许多功能,使用上更加方便了。
datasnap主要提供客户端和中间件之间的通信,不但支持com+技术也支持tcp/ip或者corba,它们使用类似的界面和方法,其结果由程序自动完成,这就大大扩充了它的应用范围。
下面我们通过几个例子来说明多层数据库的设计问题。
主要想解决这样几个问题:如何建立一个简单的分布式系统,如何使用sql,如何传递附加信息和向客户提供服务器方法,如何建立主从表结构。理解了这些方法,我们就可以建立属于自己的性能更加高超的数据库系统来。
这些实例,我们不但要会做,更要理解。
必须要提醒的是,前台机器上除了应用程序以外,还必须把一个midas.dll文件复值到前台机器上,这个文件在服务器的winnt\system32目录下。
服务器端程序
服务器端程序实际上是个com 工程,它本身连接数据源,再通过接口与客户端联系,这个com 工程必须注册在服务器上。
首先建立一个空白的工程。
file -> new -> other -> multitier -> remote data module(远程数据模块)
对话框: coclass name : com程序的名称,前台依据这个名字查找com程序(pct121) instancing :执行模式,大部分用multiple instance(多重实例)
threading model:线程模式,建议用apartment(单元)
下面我们就会对这几个选择详加说明。
ok,产生一个窗口,在这个窗口里,可以放入数据控件。
在viwe -> type libray 中,我们可以看到这个com 的一些特性。我们也可以记下系统提供的guid,以备后来使用。
加入一个adotable,并设置其指向一个数据库。
再设置一个datasetprovider(在dataaccess页)指向adotable
这就完成了服务器端的程序设计。保存,编译,注册(注意,只要运行就自动在本机注册了)。
这里需要做几个说明:
1) 在客户端,数据控件一般要和datasource相连,但在服务器端,主要要考虑数据和接口相连,delphi 5.0以上版本规定,使用datasetprovider
就不需要再针对每个控件做export(导出)操作,而是由应用程序服务器自动帮前台查找这就简化了程序和维护量。但是,前台每个dataset 必须有个
对应的datasetprovider 才行。
2)关于建立com 时的几个选项现在说明一下:
a) instancing :
multiple instance: 一个应用程序可以被多个前台程序调用使用,启动和执行的效率比较高,不耗费服务器太多的资源,管理上也比较方便。
single instance: 一个应用程序只能被一个前台程序调用,由于没有排队问题,所以当某个查询崩溃时,不会影响其它的查询,但是,一个前台调用必然在服务器上建立一个应用程序服务器的process (进程),占用资源比较多,影响服务器整体执行效率。
internal: 建立一个in-process的com 程序(也就是dll文件的格式),由于mult-tier 结构中,应用程序服务器和前台程序是放在不同的地方的,两台机器的两个程序就无法共享同一个process,所以很少设置成internal模式的。
b) threading model:
apartment: 每个实例一次只能处理一个前台发出的request(请求),如果同时建立多个in-process com 程序,那每个com 程序就会有一个现程服务,所以数据是安全的,当然要注意某些共享变量的冲突。
single: 单线程,循环工作,不会出现多任务的问题。
free : 可以让remote data module自己处理多线程问题,客
户端程序需要用多线程方法来处理。
both : 和free几乎相同,但对应前台界面的callback都是连
续的。
如果注册后无法确认是否注册成功,可以用c:\winnt\regedit.exe检查。
客户端程序
下面的例子只提供了数据库操作的最基本的功能,主要说明数据源的连接方法。
1)建立一个普通的工程。
2)放置一个tdcomconnrction控件(在datasnap页),属性:
在本机注册时,可直接设置以下属性:
servername:应用程序服务器注册名(pro1.pc121)
connected=true 激活
这时你可以看到服务器端的com 程序被激活了。
如果在网络上调试,需要给出服务器名:
computername:服务器名(自动给出网上邻居)
注意:
serverguid的guid值是自动给出的。
3)放置一个tclientdataset控件(在data access页)
属性:
name=cdscustomer(重新起名)
remoteserver= dcomconnrction1
providername:=datasetprovider1(服务器端将被激活)
active=true (激活后将能正常连接)
4)放置tdatasource,属性:
dataset:指向cdscustomer。
其余犹如普通的数据库设计。我们也可以练习一下tactionlist控件的使用,先做一个小练习:先用普通的方法连上数据库,并用表格显示:
放一个toolbar加入四个按钮。然后把standard--àactionlist加入进去。
在actionlist上右键,选:action list editor
多层数据库中的一个例子在“客户端-2”中。其中写入和退出在standard action 内找不到,需要自己编,在toolbar1内再加入两个button,写:
procedure tform1.applyupdateexecute(sender: tobject);
begin
cdscustomer.applyupdates(-1);
showmessage('已经正确地写入数据库中!!');
end;
procedure tform1.closeactionexecute(sender: tobject);
begin
close;
end;
下面装饰这个button组,调入一个imagelist1,调入相应的图形:
toolbar1的属性image=imagelist1
showhint=true
把每个button的hint的属性放入适当的值。只要服务器端正确的注册,这个程序使用是没有问题的。
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器