TDSServerClass的LifeCycle设置为Session的情况下,意味着每个请求会启动一个线程服务,而且TDSServerClass的DSServerClass1GetClass中指向的业务处理类也是线程安全的,每个请求都会new一个新的业务处理类来服务当前线程;
测试如下:
type {$METHODINFO ON} TServerMethods1 = class(TDataModule) sqlconn: TSQLConnection; private public function EchoString(Value: string): string; function ReverseString(Value: string): string; function getServerThreadId() : Integer;
//返回当前线程ID function getServerDbId() : Integer;
//返回当前DbConn的内存句柄 end; {$METHODINFO OFF} implementation {$R *.dfm} uses System.StrUtils; function TServerMethods1.EchoString(Value: string): string; begin Result := Value; end; function TServerMethods1.getServerDbId: Integer; begin Result := Cardinal(@sqlconn); end; function TServerMethods1.getServerThreadId: Integer; begin Result := GetCurrentThreadId; end; function TServerMethods1.ReverseString(Value: string): string; begin Result := System.StrUtils.ReverseString(Value); end;
启动服务端后;连续启动多个客户端时服务返回服务线程信息:
3个客户端获取的服务线程id,服务db.connection都是不同的;
在Sqlserver的连接监视面板中观察也是每个客户端新建了一个新的连接;
【总结】
在小并发用的mis中,完全不用考虑数据库连接池和负载均衡之类的东东,确实的方便简单,三层开发会像两层一样变的简单,只要服务端的封装+客户端对TQuery的调用封住能够屏蔽掉三层的边边角角那就更好了,下次实验吧;