18年9月12日 : 对服务程序内核进行以下更新: 1、接收数据包时,接收图片,文件,及其他非执行命令时,创建一个内存没有释放。 这段代码没有在TRY范围内。该功能执行完后要自己释放。 ms := TBytesStream.Create; if mc = 'fim' then // 多个文件上传 begin SetLength(tee, 10); pvObject.ReadBuffer(PChar(tee)^, 10); ................................... 2、服务程序接受执行SQL脚本更新的文件: 系统不支持执行太长的文件,如修改存储过程。。。就必须要使用此功能。 else if mc = 'sql' then // 上传上来的sql脚本文件,必须是UNICODE格式 begin SetLength(tee, 10); pvObject.ReadBuffer(PChar(tee)^, 10); ms.SetSize(pvObject.Size - 13); pvObject.ReadBuffer(TBytesStream(ms).Memory^, pvObject.Size - 13); 3、连接池断开释放的功能停用。主要是多线程用户有可能在使用该连接,如果本线程去释放, 其他线程读CONNECTED 是否连接的属性时会直接报读地址错误。 而且CONNECTED的属性不能真正反应与MSSQL的连接是否有效,有时断开后该属性还是为TRUE,不可靠, 使用直接OPEN是否返回结果的方式来判断连接是否有效。 { **************************************************************** 释放EXE的连接,主要是在连接SQLSERVER断开时用 **************************************************************** } procedure TDmServer.FreeExecAdo; var i: Integer; begin try for i := Self.ComponentCount - 1 downto 0 do begin if (Self.Components[i] is TADOConnection) then begin if Self.Components[i] <> AdoConMain then TADOConnection(Self.Components[i]).Free; end; end; except // 不管是否创建,都要计数一次 end; end; 4、日记文件全部以HONIIC,Z,S +年月日的格式。 5、错误出现在与数据连接断开,又重连时,点修改,如果连接一直错误,服务器就会出现无法跳出临界的锁定。 解决办法: EXECSQL 过程,EnterCriticalSection(CLEXE) 进入临界时,必须要在测试网络是否通后才进行。 且要跳过 ‘T' 的参数。这样处理在连接无法完成时,返回错误信息,并跳出临界。 所有测试网络是否通的代码全转成以下片断。 // --------先测试网络是否通-------- i := 0; repeat try AdoQ.sql.Text := ' select 1 as D'; AdoQ.open; // 如果出错,肯定是链接断开 AdoQ.Close; except AdoQ.connection.Connected := False; end; i := i + 1; until (i = 2) or AdoQ.connection.Connected; if AdoQ.connection.Connected = False then begin Result := '数据库连接失败!'; exit; end else begin if (g_net = 0) and (param <> 'T') then EnterCriticalSection(CLEXE); end; 6、 |