} } }

    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
    whilenot self.Terminated) andnot __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个连接估计同时在履行数据库的也不过就几百个罢了。处理惩罚起来应当是没有题目的。明天给群里的伴侣测试下。多弄几台客户端测试下



    容易发怒的意思就是: 别人做了蠢事, 然后我们代替他们, 表现出笨蛋的样子。—— 蔡康永
    分享到: