最佳拍档-delphi+java+oracle的系统实现(提供源码) ( 积分: 0 )

L

lxchjun

Unregistered / Unconfirmed
GUEST, unregistred user!
最佳拍档-delphi+java+oracle的系统实现
系统实现的目标:
1>提供一个稳定,高效,简单的三层开发的架构;
2>提供一些企业级应用的公共功能;
[客户端]
1>选择基于阻塞模式的Indy通信套件作为通信工具;(可使delphi代码更简洁)
2>选择tcp/ip作为通信协议;(可选择web service,http,主要看appserver的架设情况;甚至可以在tcp/ip的基础上自定义通信协议)
3>选择XML或变长字符串或文件,内存流作为数据包传递信息;
数据节点的结构:
|------------|------------|------------|-----------|
| 长度 |数据 |长度 |数据 |
|------------|------------|------------|-----------|
说明:
1. 长度为其后数据串的长度的长度串;
2. 数据采用变长方式组织;
一般数据包的结构:
|------------|------------|------------|-----------|------------|------------|------------|-----------|
| 名称长度 |名称 |值长度 |数据值 | 名称长度 |名称 |值长度 |数据值 |
|------------|------------|------------|-----------|------------|------------|------------|-----------|
4>查询数据:客户端发送查询命令到appserver,appserver解析命令;通过jdbc到数据库查询数据;
appserver再把查询的数据打包为符合TClientDataSet.XMLData要求的XML数据包返回到客户端;
5>更新数据:利用TClientDataSet.Delta的属性直接映射为insert,update,delete类型的SQL语句,然后发送到Appserver进行事务处理;
6>接口规划:
函数功能: 发送操作命令和数据到应用服务器
函数声明: function StreamCommand(ASendText:WideString;ASendStream:TStream=nil):TStream;stdcall;external 'Communication.dll';
参数说明: -------------------------------------------------------
参数名称 描述
-------------------------------------------------------
ASendText 要发送的字节数据(一般应包括命令信息)
-------------------------------------------------------
ASendStream 要发送的内存流或文件流等数据(默认为nil)
-------------------------------------------------------
函数说明:正常返回字节流数据(可能返回空串);异常返回nil;此函数一般供DLL中的接口函数调用;
用例:Result:=StreamCommand('013SelectCommand:045SELECT * FROM CRM_CUSTOMER WHERE B_COMPANY=1 :');
这个语句的意思是发送一个查询命令到AppServer,命令的内容为SELECT * FROM CRM_CUSTOMER WHERE B_COMPANY=1;
如果命令能正确执行,那么AppServer会把查询的结果打包发送到客户端,以字节流的形式返回.


函数功能: 查询单个数据集
函数声明: function SelectData(ACDS: TClientDataSet;const ASelectText: string):Boolean;
参数说明: -------------------------------------------------------
参数名称 描述
-------------------------------------------------------
ACDS 存放查询结果集的TClientDataSet
-------------------------------------------------------
ASelectText 要发送的单条查询语句
-------------------------------------------------------
函数说明: 成功返回[true](包括只有数据元的空数据集);失败返回[false]

用例: Result:=SelectData(cdsTemp,'SELECT * FROM CRM_CUSTOMER');这个语句的意思是:
发送一个查询语句到AppServer,如果命令能正确执行,那么AppServer会把查询的结果集打包发送到客户端事先创建好的cdsTemp中.

*************************************************************************************************************************
函数功能:查询多个数据集
函数声明:function SelectDatas(ACDS:array of TClientDataSet;const ASelectText: TStringList):Boolean;
参数说明:-------------------------------------------------------
参数名称 描述
-------------------------------------------------------
ACDS 存放查询结果集的多个TClientDataSet列表
-------------------------------------------------------
ASelectText 要发送的多条查询语句列表
-------------------------------------------------------
函数说明:成功返回[true](包括只有数据元的空数据集);失败返回[false]

用例:
var
sSql:string;
sList:TStringList;
cdsTemp1,cdsTemp2,cdsTemp3:TClientDataSet;
begin
try
cdsTemp1:=TClientDataSet.Create(nil);
cdsTemp2:=TClientDataSet.Create(nil);
cdsTemp3:=TClientDataSet.Create(nil);
sList:=TStringList.Create;
try
sSql:='SELECT * FROM Table1';
sList.Add(sSql);
sSql:='SELECT * FROM Table2';
sList.Add(sSql);
sSql:='SELECT * FROM Table3';
sList.Add(sSql);
//把第一条查询语句的结果集存放到cdsTemp1,把第二条查询语句的结果集存放到cdsTemp2,依次类推存放顺序
SelectDatas([cdsTemp1,cdsTemp2,cdsTemp3],sList);
finally
FreeAndNil(cdsTemp1);
FreeAndNil(cdsTemp2);
FreeAndNil(cdsTemp3);
FreeAndNil(sList);
end;

except
end;

end;

**************************************************************************************************************************
函数功能: 发送一条或多条update or insert or delete类型的SQL语句到应用服务器执行
函数声明: function UpdateCommands(const AExecuteText: WideString): integer;stdcall;external 'Communication.dll';
参数说明: -------------------------------------------------------
参数名称 描述
-------------------------------------------------------
AExecuteText AppServer能解析的SQL语句
-------------------------------------------------------
函数说明: 正常返回0;异常返回非0;本函数主要供ApplyUpdates函数调用;
用例:

**************************************************************************************************************************
函数功能: 把一般手动输写的SQL语句转换为AppServer能解析的SQL语句;
函数声明: function CreateCommand(var ACommandText:WideString):integer;
stdcall;external 'Communication.dll';
参数说明: -------------------------------------------------------
参数名称 描述
-------------------------------------------------------
ACommandText 要执行的SQL语句
-------------------------------------------------------
函数说明: 正常返回0;异常返回非0;本函数主要是把SQL语句转换为满足UpdateCommands函数要求的SQL语句
用例:
**************************************************************************************************************************
函数功能: 根据单个数据集的修改信息自动生成相应SQL语句
函数声明: function CreateCommands(ATableName: WideString;ACDS: TClientDataSet;var AExecuteText:WideString): integer;
stdcall;
external 'Communication.dll';
参数说明: -------------------------------------------------------
参数名称 描述
-------------------------------------------------------
ATableNames 数据集对应的表名
-------------------------------------------------------
ACDS 修改过的数据集
-------------------------------------------------------
AExecuteText 存放对应生成的SQL语句
-------------------------------------------------------
函数说明: 正常返回0;异常返回非0;
本函数根据数据集中的修改信息可能自动生成Insert,Update,Delete类型的多条SQL语句.

用例: Result:=CreateCommands('TableName1',cds1,sSQL);


本用例会根据数据集的修改信息自动生成相应SQL语句,这样就完成了操作界面到SQL语句之间的直接映射.

**************************************************************************************************************************
函数功能: 根据数据集列表的修改信息自动生成相应SQL语句
函数声明: function CreateStatement(const ATableNames: array of string ;ACDS:array of TClientDataSet;var sSqlList:string): Boolean;
参数说明: -------------------------------------------------------
参数名称 描述
-------------------------------------------------------
ATableNames 数据集列表对应的表名列表
-------------------------------------------------------
ACDS 修改过的数据集列表
-------------------------------------------------------
sSqlList 存放对应生成的SQL语句
-------------------------------------------------------
函数说明: 成功返回[true];失败返回[false]
本函数可以和CreateCommand联合使用生成更新语句集;然后调用UpdateCommands进行事务处理

用例: 1>Result:=CreateStatement(['TableName1','TableName2','TableName3','TableName4'],[cds1,cds2,cds3,cds4]);
或者
2>Result:=CreateStatement(['TableName1'],[cds1]);


本用例会根据数据集列表中每个数据集的修改信息自动生成相应SQL语句,这样就完成了操作界面到SQL语句之间的直接映射.
其中用例2>与函数CreateCommands的功能相同.

**************************************************************************************************************************
函数功能: 更新多个数据集
函数声明: function ApplyUpdates(const ATableNames: array of string ;
ACDS:array of TClientDataSet): Boolean;
参数说明: -------------------------------------------------------
参数名称 描述
-------------------------------------------------------
ACDS 要更新的数据集列表
-------------------------------------------------------
ATableNames 要更新的表名列表
-------------------------------------------------------
函数说明: 成功返回[true];失败返回[false]
表名列表与数据集列表应该一一对应

用例: Result:=ApplyUpdates(['TableName1','TableName2','TableName3','TableName4'],
[cds1,cds2,cds3,cds4]);
本用例会根据数据集列表中每个数据集的修改信息自动生成相应SQL语句,然后把所有的SQL语句一起发送到AppServer进行事务处理.

[应用服务器]
应用服务器最重要的就是稳定,所以应用服务器应该是无状态的;然后是高效易于部署;
java天生就是用来编写服务器的;成熟的j2ee企业级应用;丰富的开源思想;于是java就成了实现应用服务器的不二选择;
具体实现:
1>其实是一个ServerSocket监听客户端发送的命令;
2>解析客户端的命令;然后分派处理;(参考command模式);
3>通过jdbc与数据库交互;
4>其实只要数据到了java端,那么只要你愿意你可以选择任意的中间件技术:weblogic,websphere,jboss等等作为应用服务器,
而尽想其提供的丰富的管理功能;

[数据库]
使用存储过程肯定是提高系统性能最有效的办法之一;一般适应情况是要提取大量的数据;与客户端交互量小;需求稳定的业务逻辑;
合理的数据库结构设计也是提高系统性能和简化编码的有效办法;

[公共功能]
1>客户端数据缓存功能:客户端可以缓存大量的客户端数据,并提供了一定程度的离线操作功能;这样在提高户交互效率的同时,
减少网络数据通讯量;还能降低服务器的负载。
2>客户端自动更新功能:解决客户端部署的问题;
3>权限管理:包括功能权限和数据权限;
4>自动编码规则;
5>运行时自定义报表;
6>系统框架基类,便于快速生成相应的扩展功能;
7>命名规则和编码规则;
以上系统框架已在大型商业系统中成功运用;这里只是简单的说明;欢迎交流;
QQ:110401920
 
三年前就用过的技术,开发成本有点大,小企业很少用了.
 
请有兴趣的朋友到以下地址下载demo:
http://download.csdn.net/down/222211
 
我们05年用与此类似的架构开发了一套系统,运行的效果不错,不过问题也不少。
 
以上说的都是经验之谈啊.此种架构方式也我是两年前做过.做时确实有些费劲,实际运行效果开始也不错,后来问题也不少,哈哈.
 

Similar threads

S
回复
0
查看
951
SUNSTONE的Delphi笔记
S
S
回复
0
查看
775
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
顶部