https://git.oschina.net/ymofen/diocp-samples/tree/master/Common
转:http://www.cnblogs.com/DKSoft/archive/2013/06/09/3127886.html
今天群里有个朋友说他们医院项目采用直连数据库,高峰时期sqlserver的连接数达到7000多,于是我准备做个用diocp做个demo,服务端用连接池。白天的时候我在想,并发如果7000个。如果用diocp做三层服务器,连接池应该在100个左右。今天晚上奋斗了一晚上,准备把测试过程中碰到的问题总结一下。
所有的代码测试代码写完后,准备开始测试,配置后服务端的连接池(config\dbpool.config)
{
"main":
{
"host": ".",
"user": "sa",
"password": "efsa",
"database": "EF_DATA"
},
}
配置中main为连接池中连接的ID<通过id获取连接>
在客户端编写测试线程
procedure TTester.Execute;
var
lvCds:TClientDataSet;
begin
InterlockedIncrement(__TesterCount);
lvCds := TClientDataSet.Create(nil);
try
while (not self.Terminated) and (not __stop) do
begin
try
FRDBOperator.clear;
FRDBOperator.RScript.S['sql'] := FSQL;
FRDBOperator.QueryCDS(lvCds);
except
on E:Exception do
begin
TFileLogger.instance.logErrMessage(FTesterCode + E.Message);
end;
end;
//每执行一次进行异常关闭连接
FRDBOperator.Connection.close;
end;
TFileLogger.instance.logDebugMessage(FTesterCode + '线程已经停止[' + TesterCode + ']');
FConnection.close;
finally
InterlockedDecrement(__TesterCount);
lvCds.Free;
end;
end;
开始测试100,个线程,在笔记本上测试
问题来了
几下客户端就连接不上了,怎么连接都连接不上<服务端连接数为0>,关闭了客户端重新开也不行。心中一下就凉了,不会我写的iocp这么脆弱吧。
经过几个小时的折腾和写各种日志,发现服务端中工作线程和监听线程都是好好的,没有退出线程。
后来我查看网络情况发现服务端有在监听9983端口<但是telnet不通>,我发现有好多被关闭的127.0.0.1->127.0.0.1:9983的连接,但是在网络状态中可以看到,
过一段几分钟后,发现又可以连接上,估计客户端不能频繁的建立连接和关闭连接。
后来把客户端代码修改下<删除下面的代码>。发现一切正常,还好不是服务端的问题,diocp还是经的住考验。
//每执行一次进行异常关闭连接
FRDBOperator.Connection.close;
<wbr></wbr>
开启1000个客户端,不停获取数据,发现服务端连接池中最多只有7个连接,不过机器比较卡了<毕竟是笔记本>,想想我白天是多想了,diocp根据cpu的数量开启的工作线程工作线程如果是7个,连接数肯定也不会超过7个。就算客户端连接有7000个,数据库的连接数也就是7个而已。
就算有7000个连接估计同时在执行数据库的也不过就几百个而已。处理起来应该是没有问题的。明天给群里的朋友测试下。多弄几台客户端测试下
<wbr></wbr>
相关推荐
Druid为监控而生的数据库连接池,它是阿里巴巴开源平台上的一个项目。Druid是Java语言中最好的数据库连接池,Druid能够提供强大的监控和扩展功能.它可以替换DBCP和C3P0连接池。Druid提供了一个高效、功能强大、可...
开源数据库连接池c3p0的jar包以及文档
开源数据库连接池 jra 包,包含 c3p0 dbcp 等 文件数据包以及jdbc事务控制管理ppt
开源数据库连接池dbcp及其文档
开源数据库连接池bonecp附教程;据说是最快的数据库连接池
连接池连接池连接池连接池连接池
Druid是阿里巴巴的一款java开源的为监控而生的数据库连接池组件。Druid是一个JDBC组件,它包括三部分: DruidDriver 代理Driver,能够提供基于Filter-Chain模式的插件体系。 DruidDataSource 高效可管理的数据库...
是 apache 上的一个 java 连接池项目,也是 tomcat 使用的连接池组件。单独使用dbcp需要3个包:common-dbcp.jar,common-pool.jar,common-collections.jar由于建立数据库连接是一个非常耗时耗资源的行为,所以通过...
C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate,Spring。
Proxool是一种Java数据库连接池技术。是sourceforge下的一个开源项目,这个项目提供一个健壮、易用的连接池,最为关键的是这个连接池提供监控的功能,方便易用,便于发现连接泄漏的情况。
C#高效数据库连接池源码
看过awesome-go项目, 汇总了很多go开源项目。 但是awesome-go收集了太全了, 而且每个项目没有详细描述。 因此我自己根据go语言中文社区提供的资料,还有互联网企业架构设计中的常见组件分类, 共精心挑选了100多个...
qt的开源项目源码qt的开源项目源码qt的开源项目源码qt的开源项目源码
。net开源项目。net开源项目。net开源项目。net开源项目。net开源项目。net开源项目。net开源项目
C#开源项目信息汇总
基于VC++和MFC的一些优秀开源项目列表 包括7-Zip,eMule,FileZilla,MiKTeX,Nokia Composer等优秀项目,有兴趣的同行可以参考参考。
sqlrelay 一个开源的数据库连接池,可以MYSQL,postgreSQL等数据库
c3p0_java开源连接池 比较全面,报错 有讲解原理
java中连接mysql的第三方开源连接池,jar包,引入工程后可直接使用其创建连接池等
本教程描述了Java领域最著名的开源项目