清幽傲竹实现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源码解析 前面 ...
随机推荐
- Configure xterm Fonts and Colors for Your Eyeball
https://wiki.mpich.org/mpich/index.php/Configure_xterm_Fonts_and_Colors_for_Your_Eyeball Screenshot ...
- oracle中操作数据
使用特定格式插入日期值 insert into emp values (,', to_date('1988-11-11','yyyy-mm-dd'), ); ,); 使用子查询插入数据 create ...
- OC的@property 和 @synthesize id
学习java的JDBC,成员变量的setter和getter,eclipse都能帮我们自动生成:当然xcode这款编译器也很强大,也能自动生成: 1:@property @property是写在类的声 ...
- execute、executeUpdate、executeQuery三者的区别(及返回值)
1. ResultSet executeQuery(String sql); 执行SQL查询,并返回ResultSet 对象. 2.int executeUpdate(String sql); 可执行 ...
- mysql中实现oracle中的rowid功能
mysql中没有函数实现,只能自己手动添加变量递增 := 就是赋值,只看红色字体就行 select @rownum:=@rownum+1,img.img_path,sku.sku_name from ...
- Codeforces Round #352 (Div. 2) D. Robin Hood
题目链接: http://codeforces.com/contest/672/problem/D 题意: 给你一个数组,每次操作,最大数减一,最小数加一,如果最大数减一之后比最小数加一之后要小,则取 ...
- 网站常用css必备css reset
在我们写前端代码页面的时候,很多常用的CSS类都是固定的!但没有一个标准或者大家都按自己的方式去随意的写,这样就每次都重复写一些固定的类! 为此HTML5 Doctor(HTML5医生)为我们总结了一 ...
- hibernate Session
转: http://kayo.iteye.com/blog/204143 Session 接口 Session 接口对于Hibernate 开发人员来说是一个最重要的接口.然而在Hibernate 中 ...
- 对于WIFI版ipad(无GPS芯片)定位功能的释疑
把玩ipad(WIFI版ipad,无GPS芯片)很久时间了,曾今有很多人(包括我)也用过它的定位功能,发现它确实很准确,通常的误差在40米以内,所以很多人都怀疑这个版本的ipad是不是真的内置了GPS ...
- 翻译:用Javascript的Function构造器伪造上下文 by Ben Nadel
在我的jQuery模板标记语言(JTML)项目中,我需要一种方式将JTML模板编译到JS函数,这样它们就可以如期地在任何时候转换成新的HTML标记.但这是一个严峻的问题,因为JTML代码涉及非作用域( ...