DIOCP开源项目-数据库连接池的使用<多帐套数据库>
很久没有写DIOCP的Demo了,主要公司的事情太繁琐,工作之余都不想动了,之前承若的群里面朋友们的DEMO,昨天晚上恶补了一下,把对数据库连接池的操作加入到了Demo中,大家可以通过SVN下载到最新的代码和Demo。
好了我带大家看看这次的DEMO,经过群里面朋友们的推荐,这次代码中引用了UntCobblerUniPool连接池代码来完成的本次的DEMO,研究了下代码,里面使用的线程时钟来做死连和多余连接的释放。感谢UntCobblerUniPool作者无私奉献的精神。
先截个图,看看服务端的界面。

主要加入了多帐套的连接的配置。配置文件存放在config\dbpool.config,是一个json格式的文件配置
{
"account2013": {
"connString": "Provider Name=SQL Server;Data Source=192.168.1.2;Database=xxxx;User ID=sa;Password=sa"
},
"account2012": {
"connString": "Provider Name=SQL Server;Data Source=192.168.1.2;Database=xxx02;User ID=sa;Password=sa"
}
}
DEMO中我演示了两个帐套(实际运行中帐套个数是不固定),account2013和account2012代表帐套的ID,在clientContext中可以通过客户端传递过来的帐套ID,获取连接字符串,到连接池中获取一个连接。
看看服务端的代码
procedure TClientContext.dataReceived(const pvDataObject:TObject);
var
lvJsonStream:TJSonStream;
lvFile:String;
lvCmdIndex:Cardinal;
lvXMLData, lvEncodeData:AnsiString;
lvSQL, lvID:String;
lvDBDataOperator:TUniOperator;
lvPoolObj:TUniCobbler; begin
lvJsonStream := TJSonStream(pvDataObject);
try
lvCmdIndex := lvJsonStream.JSon.I['cmdIndex']; //执行SQL的命令ID
if lvCmdIndex= then
begin
//客户端传递过来的帐套ID
lvID := lvJsonStream.Json.S['config.accountID'];
if lvID = '' then
begin
raise Exception.Create('没有指定帐套ID(config.accountID)');
end; //客户端指定要执行的SQL
lvSQL := lvJsonStream.Json.S['script.sql'];
if lvSQL = '' then
begin
raise Exception.Create('没有指定要执行的SQL!');
end; //通过帐套ID获取一个连接池对象
lvPoolObj := TUniPool.getConnObject(lvID);
try
//打开连接
lvPoolObj.checkConnect; //Uni数据库操作对象<可以改用对象池效率更好>
lvDBDataOperator := TUniOperator.Create;
try
//设置使用的连接池
lvDBDataOperator.Connection := lvPoolObj.ConnObj;
self.StateINfo := '借用了一个lvADOOpera,准备打开连接!';
try
//获取一个查询的数据
lvXMLData := lvDBDataOperator.CDSProvider.QueryXMLData(lvSQL);
self.StateINfo := 'lvADOOpera,执行SQL语句完成,准备回写数据';
except
raise;
end; lvJsonStream.Clear();
lvJsonStream.Stream.WriteBuffer(lvXMLData[], Length(lvXMLData));
lvJsonStream.setResult(True);
finally
lvDBDataOperator.Free;
end;
finally
//归还连接池
TUniPool.releaseConnObject(lvPoolObj);
end;
//回写数据给客户端
writeObject(lvJsonStream);
end else
begin
//返回数据
writeObject(lvJsonStream);
end;
except
on E:Exception do
begin
lvJsonStream.Clear();
lvJsonStream.setResult(False);
lvJsonStream.setResultMsg(e.Message);
writeObject(lvJsonStream);
end; end;
end;
注释写的比较清楚了,我就不再解释了,其他关联代码可以具体去看各单元的代码。
看看客户端界面。

客户端通过指定帐套ID,告诉服务端应该选用哪个数据库进行操作。
客户端执行的代码
procedure TfrmMain.btnOpenSQLClick(Sender: TObject);
var
lvRecvObj, lvSendObj:TJsonStream;
i, l, lvSize:Integer;
lvData:AnsiString;
begin
lvSendObj := TJsonStream.Create;
lvRecvObj := TJsonStream.Create;
try
lvSendObj.Clear(); //帐套ID
lvSendObj.Json.S['config.accountID'] := txtAccount.Text; //执行SQL的命令ID
lvSendObj.Json.I['cmdIndex'] := ; //要执行的SQL
lvSendObj.Json.S['script.sql'] := mmoSQL.Lines.Text; //发送到服务端进行处理<使用Indy进行传输>,如果需要使用ICS,可以在IOCPCoder文件夹中找到对应的uICSClientJSonStreamCoder.pas单元
TIdTcpClientJSonStreamCoder.Encode(self.IdTCPClient, lvSendObj); //接收服务端处理的数据<使用Indy接收数据>
TIdTcpClientJSonStreamCoder.Decode(self.IdTCPClient, lvRecvObj);
if not lvRecvObj.getResult then
begin
raise Exception.Create(lvRecvObj.getResultMsg);
end; //获取数据
SetLength(lvData, lvRecvObj.Stream.Size);
lvRecvObj.Stream.Position := ;
lvRecvObj.Stream.ReadBuffer(lvData[], lvRecvObj.Stream.Size); //放入CDS的XMLDATA
cdsMain.XMLData := lvData;
finally
lvSendObj.Free;
lvRecvObj.Free;
end;
end;
在DIOCP\Demos\IOCPCoder代码中我写了一些客户端的界面和编码器,有ICS,和Indy的,有需要的朋友可以直接引用使用。
基本上差不多了。刚刚群里面的朋友测试在XE4下面测试是通过的,我的环境是D2007。
>>>>>>DIOCP讨论群:320641073
>>>>>>SVN源码和DEMO下载:https://code.google.com/p/diocp/
DIOCP开源项目-数据库连接池的使用<多帐套数据库>的更多相关文章
- DIOCP开源项目-高效稳定的服务端解决方案(DIOCP + 无锁队列 + ZeroMQ + QWorkers) 出炉了
[概述] 自从上次发布了[DIOCP开源项目-利用队列+0MQ+多进程逻辑处理,搭建稳定,高效,分布式的服务端]文章后,得到了很多朋友的支持和肯定.这加大了我的开发动力,经过几个晚上的熬夜,终于在昨天 ...
- .NET平台开源项目速览(3)小巧轻量级NoSQL文件数据库LiteDB
今天给大家介绍一个不错的小巧轻量级的NoSQL文件数据库LiteDB.本博客在2013年也介绍过2款.NET平台的开源数据库: 1.[原创]开源.NET下的XML数据库介绍及入门 2.[原创]C#开源 ...
- DIOCP开源项目-DIOCP3的重生和稳定版本发布
DIOCP3的重生 从开始写DIOCP到现在已经有一年多的时间了,最近两个月以来一直有个想法做个 30 * 24 稳定的企业服务端架构,让程序员专注于逻辑实现就好.虽然DIOCP到现在通讯层已经很稳定 ...
- 【DIOCP开源项目】实际应用案例
案例1 DIOCP是Delphi下进行IOCP服务端通讯开发的一个非常好的开源框架,稳定.高效并且使用起来十分简单. 自己两个多月之前因为需要使用Delphi开发一个TCP服务端,当时也是到处爬文,希 ...
- DIOCP开源项目-利用队列+0MQ+多进程逻辑处理,搭建稳定,高效,分布式的服务端
最近头脑里面一直在想怎么样让能让大家基于DIOCP上写出稳定的服务端程序.很多朋友问我,你DIOCP稳定吗,我可以用他来做三层服务器吗? 当时我是这样回答的,我只能保证DIOCP底层通信的稳定. 说实 ...
- DIOCP开源项目-Delphi高性能无锁队列(lock-free)
最近想在DIOCP中加入任务调度线程,DIOCP的工作线程作为生产者(producer)将接受到的数据对象,投递到任务调度线程中,然后统一进行分配.然而这一切都需要一个队列, 这几天都在关注无锁队列. ...
- DIOCP开源项目-DIOCP3 大文件的传输DEMO<断点续传>
首先该DEMO在StreamCoder上面做的改动,期间导致StreamCoderDEMO经常出现问题,导致大家运行的时候,频频出现问题,表示道歉. 以下是测试的结果,从服务器下载传输了一个3G左右的 ...
- DIOCP开源项目-定义自己要发送的数据结构(MyObject)
印象中网络程序都是sendBuffer和recvBuffer来发送数据和接收数据,本次Demo演示如何定义定义一个自己的对象,然后我们按照OO的思想直接进行对象的发送和接收,先上个流程图. 下面是客户 ...
- DIOCP开源项目-DIOCP3的LoadRunner11测试报告
昨天有个多年的群友(B3.Locet)用LoadRunner11对DIOCP3做压力测试,说测试的时候出现了大量的10053,10054的报告.昨天晚上下载了个LoadRunner11, 今天捣鼓了下 ...
随机推荐
- quine
发鸠之山,其上多柘木,有鸟焉,其状如乌,文首,白喙,赤足,名曰:"精卫",其鸣自詨(音同"笑").是炎帝之少女,名曰女娃.女娃游于东海,溺而不返,故为精卫,常衔 ...
- 【经验总结】 fisheye 3.1.5 安装、破解全过程 图文教程(2.0以上版本均可成功!)
声明:此破解仅为个人娱乐,如果你有钱,请支持正版! 重要说明,只要把fisheye先关掉即可,然后执行下面的破解步骤,一样可以破解!本人已测试通过. 一.安装.破解fisheye最新版3.1.5 所需 ...
- iOS10 CAAnimationDelegate 的简单适配
1.iOS10中CAAnimationDelegate的警告 原有的工程用xcode8打开编译后,莫名的增加了许多警告,其中关于动画的警告有这样一个,虽然运行后发现并没有什么影响,但还是要探究一下: ...
- Linux操作系统中文件结构stat中st_size的说明以及对于文件中洞(Holes)的理解
文件stat结构体中st_size成员 对于所有的文件类型,st_size成员对其中的普通文件.目录以及符号链接有实在的意义.其中,对于普通文件而言,st_size记录了该文件的实际大小:对于目录而言 ...
- VC设置视图背景颜色方法
视图的背景一般来说是白色的,在缺省情况下,它和系统定义的颜色COLOR_WINDOW是一致的.设计者一般会希望自己的程序可以让用户轻松地改变窗口背景颜色,或是用漂亮的图片来充填背景.我们可以用Wind ...
- React(0.13) 定义一个多选的组件
<!DOCTYPE html> <html> <head> <title>React JS</title> <script src=& ...
- 六款值得推荐的Android开源框架简介
技术不再多,知道一些常用的.不错的就够了.下面就是最近整理的“性价比”比较高的Android开源框架,应该是相对实用的. 1.volley 项目地址 https://github.com/smanik ...
- 用十条命令在一分钟内检查Linux服务器性能[转]
概述 通过执行以下命令,可以在1分钟内对系统资源使用情况有个大致的了解. uptime dmesg | tail vmstat 1 mpstat -P ALL 1 pidstat 1 iostat - ...
- API接口规范
协议 API与用户的通信协议,总是使用HTTPs协议,确保交互数据的传输安全. 域名 应该尽量将API部署在专用域名之下. https://api.example.com 如果确定API很简单,不会有 ...
- NET MVC全局异常处理(一) 【转载】网站遭遇DDoS攻击怎么办 使用 HttpRequester 更方便的发起 HTTP 请求 C#文件流。 Url的Base64编码以及解码 C#计算字符串长度,汉字算两个字符 2019周笔记(2.18-2.23) Mysql语句中当前时间不能直接使用C#中的Date.Now传输 Mysql中Count函数的正确使用
NET MVC全局异常处理(一) 目录 .NET MVC全局异常处理 IIS配置 静态错误页配置 .NET错误页配置 程序设置 全局异常配置 .NET MVC全局异常处理 一直知道有.NET有相关 ...