清幽傲竹实现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源码解析 前面 ...
随机推荐
- cocos3.2版本中的一些新特性
1.设置屏幕分辨率的大小,需要手动添加: 2.去掉了所有CC开头的命名: 3.所有的单例(以前是采用shared开头方法),全部改为getInstance(); 4.cocos3.x以上的版本支持C+ ...
- 怎样开启SQL数据库服务
使用数据库时开启服务是需要的,我给大家具体介绍几种方式开启SQL Sever 服务.这几种我都用图文的形式用三个开启方式给你展示,对于不会开启服务的朋友可以学习下,这些前提是你的电脑安装了SQL数据库 ...
- hadoop历史服务器配置问题
作者:sdjnzqr 出处:http://www.cnblogs.com/sdjnzqr/ 版权:本文版权归作者和博客园共有 转载:欢迎转载,但未经作者同意,必须保留此段声明:必须在文章中给出原文连接 ...
- VMware虚拟机中Hadoop服务的端口无法访问的问题
今天安装了一个hadoop集群,因为已经在单个虚拟机上安装成功,所以初期安装相对顺利. 初始环境如下: 通过Vmware Esxi服务器虚拟机出来四台机器,每台机器的网络配置如下: ...
- 解决Maven默认仓库没有的jar下载(二)
前言: 在 “解决Maven不能下载“oracle.aspectjweaver.com.springsource.net.sf.cglib”jar(http://www.cnblogs.com/wql ...
- struts文件上传拦截器maximumSize设置文件大小不起作用
<interceptor-ref name="fileUpload"> <param name="allowedTypes ...
- jquery css 简单笔记
内容 要点:清空表单中所有数据,除去 button,submit,reset,hidden 的数据 $(':input','#myform') .not(':button, :submit, :res ...
- crawler
# !/usr/bin/env python# encoding:UTF-8from util import request_urlimport reimport osimport sys#from ...
- Even Fibonacci numbers
--Each new term in the Fibonacci sequence is generated by adding the previous two terms. By starting ...
- Javascript 中判断是谷歌浏览器和IE浏览器的方法
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...