清幽傲竹实现kbmMWServer的方法(转)
感谢竹子!
下面是一个具体查询数据库的方法:
function TSchoolSrv.PerformGetStuAttendanceState(
ClientIdent: TkbmMWClientIdentity;
const Args: array of Variant): Variant;
var
aUniQuery: TUniQuery;
aconn: TkbmMWUNIDACConnection;
json: string;
code: Integer;
msg: string;
student_name,class_name: string;
memTable: TkbmMemTable;
aStreamFormat: TkbmMWBinaryStreamFormat;
begin
code := -1;
memTable := nil;
aUniQuery := nil;
aStreamFormat := nil;
aconn := FDM.getkbmMWUNIDACConnection;
if aconn = nil then kbmMWRaiseException(101,'无可用的数据库连接.');
try
aUniQuery := UniQueryPool.Lock;
if aUniQuery = nil then kbmMWRaiseServerException('无可用的数据集对象.');
aUniQuery.Connection := aconn.Database;
aUniQuery.SQL.Text := 'select attendance_state_code,attendance_state from attendance.stu_attendance_state';
aUniQuery.sql.Text := fdm.getFinalSql(aUniQuery.sql.Text);//多库合一库时重组SQL语句
aUniQuery.Open;
memTable := kbmMemTablePool.Lock;
if memTable = nil then kbmMWRaiseServerException('无可用的内存表对象.');
memTable.LoadFromDataSet(aUniQuery,[mtcpoStructure,mtcpoProperties]);
aStreamFormat := kbmMWBinaryStreamFormatPool.Lock;
if aStreamFormat = nil then kbmMWRaiseServerException('无可用的StreamFormat对象.');
memTable.SaveToStreamViaFormat(ResultStream,aStreamFormat);
except
on e: Exception do
begin
kbmMWRaiseException(999,e.Message);
end;
end;
finally
if aUniQuery <> nil then UniQueryPool.UnLock(aUniQuery);
if memTable <> nil then kbmMemTablePool.UnLock(memTable);
if aStreamFormat <> nil then kbmMWBinaryStreamFormatPool.UnLock(aStreamFormat);
aconn.UnlockConnection;
end;
end;
下面这个方法,从kbmMWUNIDACConnectionPool取得一个可用的数据库联接.function TFDM.getkbmMWUNIDACConnection: TkbmMWUNIDACConnection;
Result := TkbmMWUNIDACConnection(kbmMWUNIDACConnectionPool1.GetBestConnection(True,0,nil,3000));
end;
最后,再看看uniQuery池管理对象的实现,整个单元,不多解释.
unit UUniQueryPool;
interface
uses
Classes, Windows, SysUtils, Uni, forms;
type
TUniQueryPool = class(TObject)
private
FObjList:TThreadList;
FTimeout: Integer; //单位:毫秒
FMaxCount: Integer;
FSemaphore: Cardinal;
function CreateNewInstance(List:TList): TUniQuery;
function GetLock(List:TList;Index: Integer): Boolean;
function getUsedCount: Integer;
public
property Timeout:Integer read FTimeout write FTimeout;
property MaxCount:Integer read FMaxCount;
property usedCount: integer read getUsedCount;
constructor Create(ACapicity:Integer);overload;
destructor Destroy;override;
function Lock: TUniQuery;
procedure UnLock(var Value: TUniQuery);
end;
var
UniQueryPool: TUniQueryPool;
implementation
constructor TUniQueryPool.Create(ACapicity:Integer);
begin
FObjList:=TThreadList.Create;
FTimeout := 3000;
FMaxCount := ACapicity;
FSemaphore := CreateSemaphore(nil, FMaxCount, FMaxCount, nil);
end;
function TUniQueryPool.CreateNewInstance(List:TList): TUniQuery;
var
p: TUniQuery;
begin
try
p := TUniQuery.Create(nil);
p.Tag := 1;
List.Add(p);
Result := p;
except
Result := nil;
Exit;
end;
end;
destructor TUniQueryPool.Destroy;
var
i: Integer;
List:TList;
begin
List:=FObjList.LockList;
try
for i := List.Count - 1 downto 0 do
begin
TUniQuery(List[i]).Free;
end;
finally
FObjList.UnlockList;
end;
FObjList.Free;
FObjList := nil;
CloseHandle(FSemaphore);
inherited Destroy;
end;
function TUniQueryPool.GetLock(List:TList;Index: Integer): Boolean;
begin
try
Result := TUniQuery(List[Index]).Tag = 0;
if Result then
TUniQuery(List[Index]).Tag := 1;
except
Result :=False;
Exit;
end;
end;
function TUniQueryPool.getUsedCount: Integer;
var
i: Integer;
List:TList;
begin
try
Result := 0;
list := FObjList.LockList;
Result := list.Count;
finally
FObjList.UnlockList;
end;
end;
function TUniQueryPool.Lock: TUniQuery;
var
i: Integer;
List:TList;
begin
try
Result := nil;
if WaitForSingleObject(FSemaphore, Timeout) = WAIT_FAILED then Exit;
List:=FObjList.LockList;
try
for i := 0 to List.Count - 1 do
begin
if GetLock(List,i) then
begin
Result := TUniQuery(List[i]);
//PostMessage(Application.MainForm.Handle, 8888,23,0);
Exit;
end;
end;
if List.Count < MaxCount then
begin
Result := CreateNewInstance(List);
//PostMessage(Application.MainForm.Handle, 8888,21,0);
end;
finally
FObjList.UnlockList;
end;
except
Result :=nil;
Exit;
end;
end;
procedure TUniQueryPool.Unlock(var Value: TUniQuery);
var
List:TList;
begin
try
List:=FObjList.LockList;
try
TUniQuery(List[List.IndexOf(Value)]).Tag :=0;
ReleaseSemaphore(FSemaphore, 1, nil);
finally
FObjList.UnlockList;
end;
//PostMessage(Application.MainForm.Handle, 8888, 22, 0);
except
Exit;
end;
end;
initialization
UniQueryPool := TUniQueryPool.Create(100);
finalization
FreeAndNil(UniQueryPool);
end.
清幽傲竹实现kbmMWServer的方法(转)的更多相关文章
- 清幽傲竹实现的kbmMWServer数据库联接失败重联(转载红鱼儿)
1.修改kbmMWUnidac单元的TkbmMWUNIDACConnection.InternalOpenConnection方法,加上: //支持unidac重联 ...
- 移动开发的框架(用Firepower,不用listview,超快) good
我是通过http传送xml后台是阿帕奇的http server,后台可以用delphi或php 都可以.用post 刚才试了试自带的TNetHttpClient,感觉还好,代码封装也不算深,收发数据也 ...
- xalion三层与Web开发帖子一览表 good
使用http.sys,让delphi 的多层服务飞起来(Delphi借用http.sys充当http服务器,也就可以发送返回JSON等信息,当然浏览器也可以使用)http://www.cnblogs. ...
- 初识kbmmw 中的ORM
在kbmmw 5.02.1 中,加入了ORM 的功能(这里可能和其他语言的定义不完全一样),我们就简单的认为 它就是一个类与数据库的转换吧.今天就先介绍一下如何通过kbmmw 的ORM 功能,实现类与 ...
- javaSE27天复习总结
JAVA学习总结 2 第一天 2 1:计算机概述(了解) 2 (1)计算机 2 (2)计算机硬件 2 (3)计算机软件 2 (4)软件开发(理解) 2 (5) ...
- mapreduce多文件输出的两方法
mapreduce多文件输出的两方法 package duogemap; import java.io.IOException; import org.apache.hadoop.conf ...
- 【.net 深呼吸】细说CodeDom(6):方法参数
本文老周就给大伙伴们介绍一下方法参数代码的生成. 在开始之前,先补充一下上一篇烂文的内容.在上一篇文章中,老周检讨了 MemberAttributes 枚举的用法,老周此前误以为该枚举不能进行按位操作 ...
- IE6、7下html标签间存在空白符,导致渲染后占用多余空白位置的原因及解决方法
直接上图:原因:该div包含的内容是靠后台进行print操作,输出的.如果没有输出任何内容,浏览器会默认给该空白区域添加空白符.在IE6.7下,浏览器解析渲染时,会认为空白符也是占位置的,默认其具有字 ...
- 多线程爬坑之路-Thread和Runable源码解析之基本方法的运用实例
前面的文章:多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类) 多线程爬坑之路-Thread和Runable源码解析 前面 ...
随机推荐
- UIViewController没有随着设备一起旋转的原因
对于iPhone app,UIViewController类提供了基本的视图管理模式.当设备改变方向的时候view controller的视图会自动随之旋转的.如果视图和子视图的autoresizin ...
- 网络笔记01-2 scoket
scoket: 1.socket /** 第一个参数(domain): 表示用什么协议 AF_INET 为IPV4开发 第二个参数(type): 表示scoket为什么类型SOCK_STREAM为TC ...
- Python的map、filter、reduce函数 [转]
1. map函数func作用于给定序列的每个元素,并用一个列表来提供返回值. map函数python实现代码: def map(func,seq): mapped_seq = [] fo ...
- 为什么数据可以从pl/sql查出来而使用ado.net查询,结果却是空?
1.背景 一条记录(如select * from A where a='1'),使用pl/sql作为条件可以查询出记录,但用ado.net sql查询结果却是空. 2.原因 a字段的数据类型的char ...
- POJ 3553 Task schedule
原题链接:http://poj.org/problem?id=3553 这道题主要就是贪心思想吧,对于每个job,根据其截止时间 dj 从小到大排序,我们必须要尽快把dj最小的job完成掉,这样才能使 ...
- 【BZOJ】【1412】【ZJOI2009】狼和羊的故事
网络流/最小割 一开始我是将羊的区域看作连通块,狼的区域看作另一种连通块,S向每个羊连通块连一条无穷边,每个狼连通块向T连一条无穷边,连通块内部互相都是无穷边.其余是四连通的流量为1的边……然后WA了 ...
- 【BZOJ】【2693】JZPTAB
莫比乌斯反演 PoPoQQQ讲义第5题,是BZOJ 2154的升级版(多次询问) 题解:http://blog.csdn.net/popoqqq/article/details/42078725 WA ...
- 一些css效果积累
悬浮效果: ul li a{text-decoration: none;color: black} ul li a:hover{color: blue} 鼠标变小手 span:hover{cur ...
- 20160723数据结构节alexandrali
大坑最后再填. 20160803:心情好回来填啦(5/7) 做的题目是: poj2970 我们先每个人都不给钱qwq 然后我们发现有一位的工作时间超过了d 那么我们就从以前安排过工作的人里,a最大的, ...
- CDATA
1DTD中的属性类型 全名:character data 在标记CDATA下,所有的标记.实体引用都被忽略,而被XML处理程序一视同仁地当做字符数据看待,CDATA的形式如下: <![CDATA ...