分布式多层数据库系统的应用Word文件下载.docx
- 文档编号:8393558
- 上传时间:2023-05-11
- 格式:DOCX
- 页数:19
- 大小:54.64KB
分布式多层数据库系统的应用Word文件下载.docx
《分布式多层数据库系统的应用Word文件下载.docx》由会员分享,可在线阅读,更多相关《分布式多层数据库系统的应用Word文件下载.docx(19页珍藏版)》请在冰点文库上搜索。
2.1软件定义
数据库设计所要的解决的问题是:
对于一个给定的应用领域,设计优化的数据库逻辑和物理结构,使之满足用户的信息管理要求和数据操作要求,有效地支持各种应用系统的开发和运行。
数据库设计的目标是为用户和各种应用系统提供一个高效的运行环境。
而数据库的设计可以视为如下的优化问题:
计算机的软硬件环境;
数据库管理系统的能力;
用户的操作要求与信息要求;
完整性和安全性约束。
2.2体系结构规划
本次设计的系统采用三层″客户/服务器″体系。
客户/服务器是在网络基础上,以数据库管理为后援,以计算机为网上工作站的一种系统结构。
该结构的关键在把网络环境上的数据库存取和应用程序一分为二,分别由网上的数据库服务器和网上客户来执行。
虽然本系统客户/服务器是建立在LAN的基础上,但它比以往的文件服务系统有了很大的改进。
首先,它消除了不必要的网络传输负担;
其次,它可以使作为数据库服务器的计算机被高度优化,以适应数据处理的需要。
客户/服务器已经能够应用于复杂的网络上,并使之能够更有效地进行选择、检索、索引排序等数据处理。
作为一种高级的分布式计算机环境、客户/服务器有足够的能力把处理后的结果(不是整个文件)通过网络传输出去,并根据用户需求灵活地配置各种大、中、小型计算机系统。
2.3系统设计
管理要求查询要求
管理结果查询结果
(顶层数据流图)
数据库设计过程:
数据库的设计过程如下图所示。
在数据库设计过程中,需求分析和概念设计可以独立于任何数据库管理系统进行。
逻辑设计和物理设计与具体的数据库管理系统密切相关。
由于需求分析比较重要。
我们在设计的时候,花了比较多的时间。
在获得这些资料之后,进行分析。
从中提取有用的部分。
分析各种用户的权限。
需求分析说明书
概念数据库模式
独立于数据(高级数据模型)
库管理系统
与数据库管
理系统相关
逻辑数据库模式
(特定数据模型)
物理数据库模式
(特定的物理存储结构和存取方式)
图:
数据库设计过程
第三章毕业设计内容
3.1分布式多层数据库开发简介
Delphi提出的MIDAS(Multi-TierdistributedApplicationServicesSuite多层分布式应用服务器组),是把原来Two-Tier数据连接放到了服务器端的COM组件上,客户端只剩下了执行文件和MIDAS.DLL,前台和服务器上的COM组件,通过DCOM机制互相沟通。
这个多的一层,称为应用程序服务器(ApplicationServer),或者称为中间件。
这种多层分布式工作机制,主要基于这样几点考虑:
1、减少客户机的维护量,因为前台程序比较简单。
把企业逻辑封装在通用的中间件应用服务器中,不同的客户都可以共享同一个中间层(包括Web),而不必每个客户都单独实现企业规则,避免了重复开发和维护的麻烦。
由于客户程序相当瘦(这就是现在流行的瘦客户机概念),无论是开发还是发布,都变得简单了。
2、便于升级,当中间件升级的时候,客户程序可能不需要变化。
实现了分布式数据处理,把一个应用程序分布在几台机器上运行,可以提高应用程序的性能,也可以把敏感部分封装在中间件,为不同的用户设置不同的访问权限,增强了安全性。
3、减少直接连接数据库的用户数目,减少费用。
在Delphi6.0上,在原来的MIDAS基础上,发展了DataSnap技术,在很多细节方面,它提供了原来MIDAS所没有的许多功能,使用上更加方便了。
DataSnap主要提供客户端和中间件之间的通信,不但支持COM+技术也支持TCP/IP或者CORBA,它们使用类似的界面和方法,其结果由程序自动完成,这就大大扩充了它的应用范围。
必须要提醒的是,前台机器上除了应用程序以外,还必须把一个MIDAS.DLL文件复值到前台机器上,这个文件在服务器的WINNT\System32目录下。
3.2服务器端程序的建立
服务器端程序实际上是个COM工程,它本身连接数据源,再通过接口与客户端联系,这个COM工程必须注册在服务器上。
首先建立一个空白的工程,在工程里放置一个Adoconnection组件。
然后再建一个远程数据模块file->
New->
Other->
Multitier->
RemoteDataModule(远程数据模块)。
CoclassName:
libserver,Instancing:
执行模式,大部分用MultipleInstance(多重实例),ThreadingModel:
线程模式,建议用Apartment(单元),产生一个窗口,在这个窗口里,可以放入数据控件。
在Viwe->
TypeLibray中,我们可以看到这个COM的一些特性。
我们也可以记下系统提供的GUID,以备后来使用。
加入一个ADOTable,并设置其指向一个数据库。
再设置一个DataSetProvider(在DataAccess页)指向ADOTable,这就完成了服务器端的程序设计。
保存,编译,注册(注意,只要运行就自动在本机注册了)。
3.3客户端程序的建立
在Two-Tier模式中,客户端(Client)程序是直接和服务器的数据源相连的,而Multi-Tier模式,多个客户端连接的是一个应用程序服务器,因为收费是按客户端数计算的,所以,数据库的使用费用比较低。
1、建立一个普通的工程。
2、放置一个TDCOMConnrction控件(在Datasnap页),属性:
在本机注册时,可直接设置以下属性:
ServerName:
应用程序服务器注册名(server.libserver),Connected=true。
这时你可以看到服务器端的COM程序被激活了。
如果在网络上调试,需要给出服务器名:
ComputerName:
服务器名(自动给出网上邻居)注意:
ServerGUID的GUID值是自动给出的。
3、放置一个TClientDataSet控件(在DataAccess页),属性RemoteServer=DCOMConnrction1,ProviderName:
=DataSetProvider1(服务器端将被激活),Active=true(激活后将能正常连接)
4、放置TDataSource,属性:
Dataset:
指向cdsCustomer。
这样一个客户端程序就建立好了,其余犹如普通的数据库设计。
3.4客户端实现SQL查询
由于在客户端不存在TQuery控件,似乎客户服务器模式是无法做SQL查询的。
但是,Delphi很好的解决了这个问题。
事实上,只要客户端连接上服务端应用程序,客户端的TClientDataSet就包含了一个名字为Provider的属性,对应到服务器端DataSetProvider的所有默认属性和方法,其中DataSetProvider有一个Options属性,只要让其中的poAllowCommandText=true,那么,DataSetProvider的poAllowCommandText就可以接受前台来的SQL命令,并传送给TQuery。
可以看出,真正传递数据的是DataSetProvider的接口,所以,用这个接口搭建传递SQL的桥梁是必需的。
客户端进行SQL查询的方法是:
ClientDataSet.Close;
ClientDataSet.CommandText:
='
SQL语句'
;
ClientDataSet.Open;
3.5动态连接应用程序服务器的实现
客户端程序在运行时,需要连接应用服务器程序以取得服务。
但是,在系统实际应用的时候,运行应用服务器程序的计算机是经常改变的,因此在客户端程序启动时,应该先找到运行应用服务器程序的计算机的设置。
在Delphi中新建一个窗体,将单元文件保存为connect.pas窗体的Name属性设为fm_serconfig,Caption属性设为”服务器配置”。
在“连接设置”窗体中,需要输入应用服务器主机名(或者应用服务器IP地址)和应用服务器的端口号,这些配置信息将用来连接应用服务器。
如果连接成功,输入的配置信息将被写入到注册表中,以后程序启动时,读取注册表配置信息,就可而已连接应用服务器程序了。
程序的具体实现部分如程序清单如下所示:
procedureBitBtn1Click(Sender:
TObject);
procedureButton1Click(Sender:
private
procedureWriteToReg(constbappHost,bappIp,aPort:
string);
{Privatedeclarations}
public
{Publicdeclarations}
end;
var
fm_SerConfig:
Tfm_SerConfig;
Connected:
boolean=false;
//代表是否连接成功
implementation
usesnetlist,data;
{$R*.dfm}
procedureTfm_SerConfig.BitBtn1Click(Sender:
begin
if((Edt_host.Text='
'
)or(Edt_host.Text=null))
and((Edt_ip.Text='
)or(Edt_host.Text=null))then
begin
application.MessageBox('
请输入服务器和IP'
'
输入错误'
mb_iconinformation+mb_defbutton1);
exit;
end;
try
strtoint(edt_Port.text);
except
Application.MessageBox('
请输入正确的端口号'
'
输入错误..'
mb_iconinformation+mb_defbutton1);
statusbar1.Panels[0].Text:
='
正在连接服务器,plealewait'
statusbar1.Refresh;
screen.Cursor:
=crHourGlass;
fm_data.Socket.Connected:
=false;
fm_data.Socket.Host:
=edt_host.Text;
fm_data.Socket.Address:
=edt_ip.Text;
fm_data.Socket.Port:
=strtoint(edt_port.Text);
=crdefault;
=true;
连接成功'
图书管理系统'
connected:
连接失败'
mb_iconinformation+mb_defbutton1);
//连接成功向注册表里写入应用服务器配置信息
WriteToReg(edt_Host.Text,edt_IP.Text,edt_Port.Text);
close;
//利用可视化窗体来选择计算机
procedureTfm_SerConfig.Button1Click(Sender:
edt_ip.Clear;
edt_host.Text:
=NetExecute(TFm_NetList);
//把信息写入注册表
procedureTfm_SerConfig.WriteToReg(constbappHost,bappIp,aPort:
reg:
Tregistry;
reg:
=Tregistry.Create;
reg.RootKey:
=HKEY_LOCAL_MACHINE;
ifnotreg.OpenKey('
\Software\pz'
false)then//如果可以创建目录
reg.CreateKey('
);
reg.OpenKey('
false);
reg.WriteString('
host'
bapphost);
ip'
bappip);
port'
aport);
reg.Free;
end.
打开“连接设置”配置窗口,在打开窗体之前,函数已经将布尔变量Connected设为False,而在窗体被关闭之后,将返回Connected变量的值,根据布尔变量Connected的值可以判断是否已经连接上应用服务器。
在连接设置主窗口中,我们为应用服务器名提供了辅助录入的方法,点击应用服务器名编辑框右边的省略号按钮(Button1),将弹出一个浏览局域网计算机的对话框,以方便用户选择应用服务器所在的计算机。
在此我们调用了一个NetExecute方法,它将返回用户选中的计算机的主机名。
这个方法是如何实现的呢?
下面将介绍NetExecute方法的实现过程。
在Delphi中新建一个窗体,将窗体单元文件保存为netlist.pas,窗体的Name属性设为Fm_netlist。
在列举网络资源窗体中,将按照工作组以树型目录的形式显示局域网中的计算机。
程序的具体实现部分如下所示:
procedureFormActivate(Sender:
procedureTreeView1Click(Sender:
proceduregetcomputername;
proceduregetgroupname;
{Privatedeclarations}
{Publicdeclarations}
functionNetExecute(aFormClass:
TFormClass):
string;
fm_NetList:
Tfm_NetList;
node:
Ttreenode;
aComputerName:
//全局变量,存储选中的主机名
//打开窗体,并返回选定的计算机
withaFormClass.Create(Application)do
showModal;
finally
free;
result:
=aComputerName;
procedureTFm_netlist.FormActivate(Sender:
node:
=treeview1.items.add(Treeview1.topitem,'
整个网络'
node.imageindex:
=0;
treeview1.setfocus;
procedureTFm_netlist.TreeView1Click(Sender:
iftreeview1.Selected.Level=0then
iftreeview1.Selected.Count=0then
//添加工作组名
getgroupname();
iftreeview1.Selected.Level=1then
//添加计算机名
getcomputername;
iftreeview1.Selected.Level=2then
bitbtn1.Enabled:
=true
else
//取得计算机名
procedureTfm_netlist.getcomputername;
NetResource:
TNetResource;
Buf:
Pointer;
Count,BufSize,Res:
DWord;
Ind:
Integer;
lphEnum:
THandle;
Temp:
TNetResourceArray;
groupname:
my_node:
my_node_2:
screen.Cursor:
=crHourGlass;
statusbar.panels[0].text:
正在列举组名...,请稍侯'
statusbar.refresh;
my_node:
=treeview1.Selected;
groupname:
=treeview1.Selected.Text;
FillChar(NetResource,SizeOf(NetResource),0);
//初始化网络层次信息
NetResource.lpRemoteName:
=@GroupName[1];
//指定工作组名称
NetResource.dwDisplayType:
=RESOURCEDISPLAYTYPE_SERVER;
//类型为服务器(工作组)
NetResource.dwUsage:
=RESOURCEUSAGE_CONTAINER;
NetResource.dwScope:
=RESOURCETYPE_DISK;
//列举文件资源信息
//获取指定工作组的网络资源句柄
Res:
=WNetOpenEnum(RESOURCE_GLOBALNET,RESOURCETYPE_DISK,
RESOURCEUSAGE_CONTAINER,@NetResource,lphEnum);
ifRes<
>
NO_ERRORthenExit;
//执行失败
whileTruedo//列举指定工作组的网络资源
Count:
=$FFFFFFFF;
//不限资源数目
BufSize:
=8192;
//缓冲区大小设置为8K
GetMem(Buf,BufSize);
//申请内存,用于获取工作组信息
//获取计算机名称
=WNetEnumResource(lphEnum,Count,Pointer(Buf),BufSize);
ifRes=ERROR_NO_MORE_ITEMSthenbreak;
//资源列举完毕
if(Res<
NO_ERROR)thenExit;
Temp:
=TNetResourceArray(Buf);
forInd:
=0toCount-1do//列举工作组的计算机名称
//获取工作组的计算机名称,+2表示删除"
\\"
,如\\wangfajun=>
wangfajun
my_node_2:
=treeview1.Items.AddChild(my_node,Temp^.lpRemoteName+2);
my_node_2.imageindex:
=2;
Inc(Temp);
=WNetCloseEnum(lphEnum);
//关闭一次列举
NO_ERRORthenexit;
FreeMem(Buf);
=crDefault;
//获取组名
procedureTfm_NetList.GetGroupName;
DWORD;
p:
i,j:
SmallInt;
NetworkTypeLis
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 分布式 多层 数据库 系统 应用