DIOCP开源项目-测试数据库机能
添加时间:2013-6-11 点击量:
今天群里有个伴侣说他们病院项目采取直连数据库,岑岭时代sqlserver的连接数达到7000多,于是我筹办做个用diocp做个demo,办事端用连接池。白天的时辰我在想,并发若是7000个。若是用diocp做三层办事器,连接池应当在100个阁下。今天晚上斗争了一晚上,筹办把测试过程中碰着的题目总结一下。
所有的代码测试代码写完后,筹办开端测试,设备后办事端的连接池(config\dbpool.config)
{
main:
{
host: .,
user: sa,
password: efsa,
database: EF_DATA
},
}
设备中main为连接池中连接的ID<经由过程id获取连接>
在客户端编写测试线程
procedure TTester.ute;
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;
开启1000个客户端,不绝获取数据,发明办事端连接池中最多只有7个连接,不过机械斗劲卡了<毕竟?成果是笔记本>,想想我白天是多想了,diocp按照cpu的数量开启的工作线程工作线程若是是7个,连接数必然也不会跨越7个。就算客户端连接有7000个,数据库的连接数也就是7个罢了。
就算有7000个连接估计同时在履行数据库的也不过就几百个罢了。处理惩罚起来应当是没有题目的。明天给群里的伴侣测试下。多弄几台客户端测试下
容易发怒的意思就是: 别人做了蠢事, 然后我们代替他们, 表现出笨蛋的样子。—— 蔡康永
今天群里有个伴侣说他们病院项目采取直连数据库,岑岭时代sqlserver的连接数达到7000多,于是我筹办做个用diocp做个demo,办事端用连接池。白天的时辰我在想,并发若是7000个。若是用diocp做三层办事器,连接池应当在100个阁下。今天晚上斗争了一晚上,筹办把测试过程中碰着的题目总结一下。
所有的代码测试代码写完后,筹办开端测试,设备后办事端的连接池(config\dbpool.config)
{
main:
{
host: .,
user: sa,
password: efsa,
database: EF_DATA
},
}
设备中main为连接池中连接的ID<经由过程id获取连接>
在客户端编写测试线程
procedure TTester.ute;
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;
开启1000个客户端,不绝获取数据,发明办事端连接池中最多只有7个连接,不过机械斗劲卡了<毕竟?成果是笔记本>,想想我白天是多想了,diocp按照cpu的数量开启的工作线程工作线程若是是7个,连接数必然也不会跨越7个。就算客户端连接有7000个,数据库的连接数也就是7个罢了。
就算有7000个连接估计同时在履行数据库的也不过就几百个罢了。处理惩罚起来应当是没有题目的。明天给群里的伴侣测试下。多弄几台客户端测试下
容易发怒的意思就是: 别人做了蠢事, 然后我们代替他们, 表现出笨蛋的样子。—— 蔡康永