300分請沙隆巴斯的主人在此講一下關于三層中從pooler﹐到線程﹐包括客戶端如何實現線程﹐中間層如何實現線程。(300分)

  • 主题发起人 主题发起人 liuxiangsoft
  • 开始时间 开始时间
L

liuxiangsoft

Unregistered / Unconfirmed
GUEST, unregistred user!
300分請沙隆巴斯的主人在此講一下關于三層中從pooler﹐到線程﹐包括客戶端如何實現線程﹐中間層如何實現線程。

昨天在同沙隆巴斯的主人談到有關這個三層中似乎人人都關心的話題﹐如果我現在對數據表進行更新﹐比喻是更新事件的跟蹤記錄﹐那個更新的頻率是相當高的﹐要是有50個用戶以上﹐那怎么辦﹖如果針對這個問題﹐讓每一個更新在一個線程里執行﹐如果在客戶端寫更新代碼﹐針對沙隆巴斯的意思又好像沒有領悟到面向對像化這一個概念。如果在中間層更新﹐能不能將線程寫成一個比喻是函數﹐或是過程。這樣我們要用到更新時調用就行了。但是在三層中的中間層這樣實行我還沒有見過書上﹐或是dfw上講過。前不久訂的d6開發人員指南還在路上沒有回來﹐目前也沒有東西參考﹗

對于中間層用到pooler﹐李維的系統編上講到了﹐但全文加起來不足千字﹐加上他又螺嗦﹐根本沒有什么可以學的。我想問一下﹐連接池是不是里面全用來放ado的連接控件的東東﹐這樣在客戶端要不要引用中間層的 server_lib這個文件﹖那對象池是實現讓超過規定服務的數目等待的功能﹐但delhpi的demo的那個是不是屬于對象池﹐雖然我現在proman的幫助下已經用到的那個等同于demo的池﹐但是對于池我實際用法﹐我還是不清﹐但是對于其功能的描述﹐我是相當清楚的﹐因為你﹐還有proman﹐已給我解釋的相當清楚了。而我就是不知你在《《在開發中應用三層與三層》》這個貼子中所貼出來的關于池的代碼是如何用到程序中的﹐我當時雖明白你的那個一個所謂的連接池﹐也明白proman的那也是一個連接池﹐那在客戶端如何引用呢﹖proman說他的三層中沒有一個provider﹐但是這樣行嗎﹖用到連接池﹐是不是在客戶端可以直接引用中間層的。pas文件﹐而無需用provider﹐可直接用adoquery﹖

針對以上疑問﹐我想在三層中正處于學習中的朋友﹐都是很想知道的﹐還請沙隆巴斯主人﹐proman你們這些有經驗的朋友﹐多多幫助﹐帶動我們。

謝謝﹗
 
帮顶一下
 
謝謝hardware007朋友﹗
昨天我沙隆巴斯朋友在qq上談了一下﹐一席談話對我啟發很大﹐所以在今天想再請沙隆巴斯的主人過來一下﹗
 
TO: liuxiangsoft,
你好象还是未脱离二层的概念。
首先对于三层来说,客户端无须关心中间层如何为它提供数据,如何更新数据,也不用关心
数据存储在何处,所以客户端是无须关心连接池,对象池等一系列中间层的优化技术,对于
客户端来说,是很简单的,就是调用中间层提供的接口,完成任务即可。
对于中间层来说,为了使系统的整体性能优异,就需要采取种种的方法来提供性能,比如
各种对象池,连接池等等。对于COM对象来说,又存在一个线程实例问题,对于这个问题
我很建议你们去MSDN上好好看看,我想我们说的都不及MSDN上讲的详细。
http://msdn.microsoft.com/library/default.asp
到这里好好看看吧。
 
to : PROMAN:

不要開玩笑了﹐那可全是e文的﹐
其實我的目的很簡單﹐就是想將公司現的mrp用delphi寫出來﹐與其用二層﹐還不如用三層﹐與其用三層﹐還不如在三層中將能體現數據優化的手段體現出來。比喻﹕pooler與線程。
 
我想还是做个DEMO得了。

以简化了的图书馆借还书为例:

图书馆有N种书,每种有L(n)本。
每个借阅人最多同时可借有K本书(即借了未还的加新借的不可大于K);同一借阅人不
可同时借有同一种书两种以上。
每书借阅时间不可超一定限期(为方便,暂定3个月);超期借阅者在归还前不可新借
任何书籍。
 
我想沙隆巴斯的主人或是proman您們誰能做一個demo都好﹐能得到您們的幫助我將中心感謝。讓我們蹺首以待激動人心時刻的到來﹗

chinalx8028@163.com
 
ercnet@QQ.COM
 
還有一個問題﹕

請問沙隆巴斯的主人和proman﹕

你們在進行三層開發時不用provider﹐那中間層同客戶層的數據是通過什么打交道的﹖
 
客户端与中间层是通过接口调用,数据只是接口的参数而已.
 
說到這個接口﹐那我想請問﹕ipooler在delphi的demo下是不是一個數據接口﹐那如果我在客戶端不引用服務層的server_lib﹐怎可調用接口﹐要是引用了server_lib﹐對于數據的存儲﹐刪除等動作﹐應該怎樣又通過接口回調到服務層去實現呢﹖
 
delphi demo中的中那个只是实现了数据库session pooling,客户端调用服务器端的方法,
服务器端的方法调用数据库连接作相应的操作。他还是要用rdm,只不过手工实现的罢了
 
沙隆巴斯的主人
高手
期待你的Demo
 
继续假定:
图书管理员信息:(为简便起见,仅分为两类角色)
管理员编号、姓名、身份证号、登录代号、登录口令、角色


书籍包括以下信息:
书名、ISBN号(假定其可唯一确定一种书)、作者(假定仅一人)、出版社。

藏书信息:
藏书编号(唯一确定一本藏书)、ISBN号。

借阅人信息:
姓名、身份证号(假定都用身份证且身份证号是唯一的)

借阅信息:
借阅编号、身份证号、藏书编号(多值属性)、日期

还书信息:
还书编号、 身份证号、藏书编号(多值属性)、日期

日志:
施动者、受动者、行为、结果、备注
 
我們都滿懷熱情的在期待﹐這個時刻空氣猶如瞬息疑固﹐沙隆巴斯主人將為我們點燃這個希望的導火線﹐讓我們奔向勝利的署光﹐讓我們迎接希望的明天﹗
 
按照上面的规格,设计了一套简陋的数据库
工作在oracle8.0.5 for winwods上
 
以下是数据库对象生成脚本:

/***************************************************************************************


名称: 大富翁图书管理DEMO数据对象生成脚本
版本: V0.1


****************************************************************************************/
create user dfw identified by dfw;
grant connect, resource to dfw;
conn dfw/dfw


/*****************************************操作员对象**************************************/

create sequence seq_Operators --操作员序号器
increment by 1 start with 10000;
create table tab_Operators ( --操作员表
O_ID number(5,0) not null, --唯一标识
O_Account varchar2(20) not null, --登录号
O_Passwd varchar2(20) not null, --口令
O_Name varchar2(40) not null, --姓名
O_IdentifyNo varchar2(40) not null, --证件号(现为身份证号)
O_Role number(1) default 1 not null, --角色(0:管理员;1:借还书员)
O_Memo varchar2(400), --备注
constraint pk_Oper primary key(o_id),
constraint uq_Oper_Account unique(O_Account),
constraint uq_Oper_IdentifyNo unique(O_IdentifyNo)
);

create or replace trigger trg_BI_operators before insert --操作员触发器(用以生成序号)
on tab_Operators for each row
declare
seq integer;
begin
select seq_Operators.nextval into seq from dual;
:new.o_ID := seq;
end;
/

insert into tab_Operators(O_Account, O_Passwd, O_Name, O_IdentifyNo, O_Role, O_Memo)
values('SysAdmin', 'Change_on_install', 'SysAdmin', '0000000000', 0, '缺省安装的系统管理员,具有最高权限,安装后请立即修改其口令');


/*****************************************操作日志****************************************/

create sequence seq_Logs --日志序号器
increment by 1 start with 10000000;
create table tab_Logs( --用户表
L_ID number(8) not null, --日志标识号
L_Date date default sysdate not null, --日期
L_OperatorID number(5,0) not null, --操作员ID
L_Action varchar2(200) not null, --行为
L_Result varchar2(200) not null, --结果
L_Memo varchar2(200) not null, --备注
constraint pk_Logs primary key(L_ID),
constraint fk_Logs_OID foreign key(L_OperatorID) references tab_Operators(O_ID)
);
create or replace trigger trg_BI_Logs before insert --用户触发器(用以生成序号)
on tab_Logs for each row
declare
seq integer;
begin
select seq_Logs.nextval into seq from dual;
:new.L_ID := seq;
end;
/




/*****************************************书籍种类对象****************************************/
create sequence seq_BookTypes --书籍类型序号器
increment by 1 start with 1000000;
create table tab_BookTypes( --书籍类型表
BT_ID number(7) not null, --书籍类型标识
BT_BookName varchar2(80) not null, --书籍名称
BT_ISBN varchar2(20) not null, --书籍ISBN
BT_Author varchar2(80) not null, --作者
BT_Publisher varchar2(80) not null, --出版社(作者和出版社本应为对外表的参照,但为了简化,姑且这样做)
BT_Memo varchar2(400), --备注
constraint pk_BookTypes primary key(BT_ID),
constraint uq_BookTypes_ISBN unique(BT_ISBN)
);
create or replace trigger trg_BI_BookTypes before insert --书籍类型触发器(用以生成序号)
on tab_BookTypes for each row
declare
seq integer;
begin
select seq_BookTypes.nextval into seq from dual;
:new.BT_ID := seq;
end;
/


/*****************************************藏书****************************************/
create sequence seq_CollectBooks --藏书序号器
increment by 1 start with 100000000;
create table tab_CollectBooks( --藏书表
CB_ID number(9) not null, --藏书标识
CB_BookTypeID number(7) not null, --书籍类型标识
CB_Status number(1) default 0 not null, --状态(0:表示在库;1:表示在借)
CB_Memo varchar2(400), --备注
constraint pk_CollectBooks primary key(CB_ID),
constraint fk_CollectBooks_BookType foreign key(CB_BookTypeID) references tab_BookTypes(BT_ID)
);
create or replace trigger trg_BI_CollectBooks before insert --藏书表触发器(用以生成序号)
on tab_CollectBooks for each row
declare
seq integer;
begin
select seq_CollectBooks.nextval into seq from dual;
:new.CB_ID := seq;
end;
/



/*****************************************借阅者对象****************************************/
create sequence seq_Readers --借阅者序号器
increment by 1 start with 100000;
create table tab_Readers( --借阅者表
R_ID number(6) not null, --借阅者标识号
R_IdentifyNo varchar2(40) not null, --证件号(现为身份证号)
R_Name varchar2(40) not null, --借阅者姓名
R_Address varchar2(100) not null, --地址
R_Phone varchar2(40) not null, --电话
R_Memo varchar2(400), --备注
constraint pk_Readers primary key(R_ID),
constraint uq_Readers_IdentifyNo unique(R_IdentifyNo) --身份证号号必须唯一
);
create or replace trigger trg_BI_Readers before insert --借阅者触发器(用以生成序号)
on tab_Readers for each row
declare
seq integer;
begin
select seq_Readers.nextval into seq from dual;
:new.R_ID := seq;
end;
/



/*****************************************图书借阅情况****************************************/
create sequence seq_Borrows --图书借阅序号器
increment by 1 start with 1000000000;
create table tab_Borrows( --图书借阅表
B_ID number(10) not null, --图书借阅标识号
B_BorrowerID number(6) not null, --借阅者标识号
B_Date date default sysdate not null, --借阅日期
B_Memo varchar2(200) null, --备注
constraint pk_Borrows primary key(B_ID),
constraint fk_Borrows_BorrowerID foreign key(B_BorrowerID) references tab_Readers(R_ID)
);
create or replace trigger trg_BI_Borrows before insert --图书借阅表触发器(用以生成序号)
on tab_Borrows for each row
declare
seq number;
begin
select seq_Borrows.nextval into seq from dual;
:new.B_ID := seq;
end;
/

create table tab_BorrowBooks( --图书借阅明细表
BB_ID number(10) not null, --图书借阅标识号
BB_CollectBookID number(9) not null, --藏书标识号
BB_Status number(1) default 0 not null, --归还情况(0:未还;1:已还)
BB_Memo varchar2(200) null, --备注
constraint pk_BorrowBooks primary key(BB_ID, BB_CollectBookID),
constraint fk_BorrowBooks_BorrowsID foreign key(BB_ID) references tab_Borrows(B_ID),
constraint fk_BorrowBooks_CollectBookID foreign key(BB_CollectBookID) references tab_CollectBooks(CB_ID)
);




/*****************************************图书归还情况****************************************/
create sequence seq_Returns --图书归还序号器
increment by 1 start with 1000000000;
create table tab_Returns( --图书归还表
Re_ID number(10) not null, --图书归还标识号
Re_BorrowerID number(6) not null, --借阅者标识号
Re_Date date default sysdate not null, --归还日期
Re_Memo varchar2(200) null, --备注
constraint pk_Returns primary key(Re_ID),
constraint fk_Returns_BorrowerID foreign key(Re_BorrowerID) references tab_Readers(R_ID)
);
create or replace trigger trg_BI_Returns before insert --图书借阅表触发器(用以生成序号)
on tab_Returns for each row
declare
seq number;
begin
select seq_Returns.nextval into seq from dual;
:new.Re_ID := seq;
end;
/

create table tab_ReturnBooks( --图书归还明细表
RB_ID number(10) not null, --图书借阅标识号
RB_CollectBookID number(9) not null, --藏书标识号
constraint pk_ReturnBooks primary key(RB_ID, RB_CollectBookID),
constraint fk_ReturnBooks_BorrowsID foreign key(RB_ID) references tab_Returns(Re_ID),
constraint fk_ReturnBooks_CollectBookID foreign key(RB_CollectBookID) references tab_CollectBooks(CB_ID)
);


 
ok﹐太感謝您了﹐我用的是sql﹐現在我照搬你數據庫建立在sql上。
 
UPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUP
 
后退
顶部