restful 服務器一個問題,看ChatGPT的威力 (續2)
實際上Pascal是一個非常優美的語言。只是仁者見仁智者見智。
我們一直埋怨,而不是埋怨自己。說到底:功力不夠。想短平快,功底又不夠,這就是挑戰。
datasnap很復雜,但是又很簡單。寫了夠小的破restful服務程序,動不動出問題。
在多次交流中,你會不斷理解和提高。





# Delphi + REST + 多線程數據庫連接規范清單 ## ?? 目標 短連接、線程安全、資源無泄漏、TCP 不掛起 --- ## 1?? 連接創建原則 - 所有方法中**禁止使用組件字段** `FDConnection1` 直接執行查詢 - **統一使用局部變量**:`LConn: TFDConnection` - 建議封裝工具函數統一創建連接:`CreateLocalFDConnectionFromTemplate` --- ## 2?? 安全連接參數設置 ```pascal LConn := TFDConnection.Create(nil); LConn.LoginPrompt := False; LConn.Params.Assign(FDConnection1.Params); LConn.Params.Pooled := False; LConn.Connected := True; ``` --- ## 3?? 查詢/操作對象規則 ```pascal LQuery := TFDQuery.Create(nil); LQuery.Connection := LConn; ``` 不要使用設計時組件字段,如 `FDQuery1`, `FDCommand1`。 --- ## 4?? 釋放規則(必須使用 try..finally) ```pascal try // 操作 finally if LConn.Connected then LConn.Close; LConn.Free; end; ``` 如使用賬套切換: ```pascal FDManager.CloseConnectionDef(LConn.ConnectionDefName); ``` --- ## 5?? 多線程場景特殊規則 - 所有數據庫對象(連接、查詢)必須是**局部變量** - 禁止在線程中訪問 `FDConnection1` 組件字段 - 使用 `TTask`, `TThread`, `TEvent`, `TInterlocked` 做線程同步 - 使用 `PostLog` 記錄連接耗時及釋放日志 --- ## 6?? 調試建議 ```pascal FDManager.Tracing := True; FDManager.TraceFileName := 'FDTrace.log'; ``` 查詢 SQL Server 當前連接: ```sql SELECT * FROM sys.dm_exec_connections WHERE session_id <> @@SPID; ``` 查看連接數: ```pascal ShowMessage(IntToStr(FDManager.ActiveConnections)); ``` --- ## 7?? REST 方法封裝建議 ```pascal function GetFDJSONDatasets(aSqlExpr: string): TFDJSONDatasets; var LConn: TFDConnection; LQuery: TFDQuery; begin LConn := CreateLocalFDConnectionFromTemplate(FDConnection1); try LQuery := TFDQuery.Create(nil); try LQuery.Connection := LConn; LQuery.SQL.Text := aSqlExpr; LQuery.Open; Result := TFDJSONDataSetsWriter.WriteDataSets([LQuery]); finally LQuery.Free; end; finally if LConn.Connected then LConn.Close; LConn.Free; end; end; ``` --- ## 推薦封裝函數 ```pascal function CreateLocalFDConnectionFromTemplate(BaseConn: TFDConnection): TFDConnection; begin Result := TFDConnection.Create(nil); Result.LoginPrompt := False; Result.Params.Assign(BaseConn.Params); Result.Params.Pooled := False; Result.Connected := True; end; ``` --- ## ? 結語 > 短連接 REST 服務的本質是:**每次來一個連接,用完立即釋放,絕不殘留。**
浙公網安備 33010602011771號