看看是否牛逼:

真不是写代码的料,也没有这样的天赋,仅仅玩玩而已。

问题:客户端边缘路由中一段js代码,使用get请求一个方法,把json数据送入数据库相关表。由于种种原因导致长连接,通过资源管理器可以看到TCP连接一直挂在那里。(该问题不知道是否是伪命题,请专业人员指导)

七搞八搞,依赖Chatgpt才(应该)搞定了,否则永远不可能,如果不是永远,那么就是非常非常遥远、遥远、遥远......。

上代码:

function TUsegear.UpdateAJson2DB4ZT(aJson: string): string;  //提交Json数组到账套表
var
Task: ITask; //用于执行异步任务
TimeoutMs: Integer; //超时时间,单位:毫秒(默认 5000ms = 5s)
TaskCompletedFlag: Integer; // 确保 TInterlocked.Exchange 线程安全 任务完成标志(0 = 未完成,1 = 已完成),用于确保线程安全
TaskResult: string;// 最终返回的执行结果
TaskEvent: TEvent; //用于通知主线程任务完成,避免 Sleep(10); 造成的 CPU 轮询
begin
Result := 'Timeout';
TimeoutMs := 10000;
TaskCompletedFlag := 0; // 0 = False, 1 = True // 任务开始时标记为未完成
TaskResult := 'Timeout';
TaskEvent := TEvent.Create(nil, True, False, ''); //启动后台任务
Task := TTask.Run(procedure
var
LocalQuery: TFDQuery;
LocalConn: TFDConnection;
ja: TJSONArray;
jo: TJSONObject;
LocalResult, ZTName, myTable, aSQL: string;
begin
LocalResult := 'Unknown Error';
ja := nil;
LocalConn := TFDConnection.Create(nil);
LocalQuery := TFDQuery.Create(nil);
try
try
LocalConn.DriverName := FDConnection1.DriverName;
LocalConn.Params.Assign(FDConnection1.Params);
// **确保复制密码和数据库信息**
LocalConn.Params.Values['Password'] := FDConnection1.Params.Values['Password'];
LocalConn.Params.Values['User_Name'] := FDConnection1.Params.Values['User_Name'];
LocalConn.Params.Values['Database'] := FDConnection1.Params.Values['Database']; try
LocalConn.Connected := True; // **在任务线程里独立连接数据库**
except
on E: Exception do
begin
LocalResult := '线程数据库连接失败: - ' + E.Message;
if Var_Log then PostLog(llError,'线程数据库连接失败: -:'+e.Message);
Exit;
end;
end; // 解析 JSON
ja := TJSONObject.ParseJSONValue(TEncoding.ASCII.GetBytes(aJson), 0) as TJSONArray;
if not Assigned(ja) or (ja.Count = 0) then raise Exception.Create('Invalid or empty JSON array'); //获取账套名称 (zt) 和目标表名 (mytable)
jo := ja.Items[0] as TJSONObject;
ZTName := jo.GetValue<string>('zt'); try
LocalConn.Connected := False; // 先确保连接断开
LocalConn.ConnectionDefName := ZTName;
LocalConn.Connected := True;//链接指定账套
if Var_Log then PostLog(llHint,'线程账套数据库连接成功');
except
on E: Exception do
begin
if Var_Log then PostLog(llError, '线程账套数据库连接失败: ' + E.Message);
Exit;
end;
end; LocalQuery.Connection := LocalConn;
LocalQuery.CachedUpdates := True; myTable := jo.GetValue<string>('mytable');
//把 JSON 转换为数据集 (Dataset) 并提交数据
aSQL := 'SELECT * FROM ' + myTable + ' WHERE 1=2';
LocalQuery.Open(aSQL);
TConverter.New.JSON.Source(ja).ToDataSet(LocalQuery);
LocalQuery.ApplyUpdates(0);
LocalResult := 'OK';
except
on E: Exception do
begin
LocalResult := 'Error: ' + E.Message;
if Var_Log then PostLog(llError,LocalResult);
end;
end;
finally
if Assigned(ja) then FreeAndNil(ja);
FreeAndNil(LocalQuery);
FreeAndNil(LocalConn);
end; TThread.Synchronize(nil, procedure //线程安全更新
begin
if TInterlocked.Exchange(TaskCompletedFlag, 1) = 0 then
begin
TaskResult := LocalResult;
TaskEvent.SetEvent;
end;
end);
end); try //任务超时处理
if not Task.Wait(TimeoutMs) then
begin
Task.Cancel;
TaskEvent.SetEvent; // 让主线程立即返回
end;
except
on E: Exception do
begin
TaskResult := 'Error: Task.Wait failed - ' + E.Message;
end;
end; //彻底释放 Task
if Task.Status <> TTaskStatus.Completed then
begin
Task.Wait(1000); // 额外等待1秒,确保任务彻底结束
end; if TaskEvent.WaitFor(TimeoutMs) = wrTimeout then
begin
TaskResult := 'Error: Event timeout reached';
end; TaskEvent.Free;
Task := nil; // 彻底释放 Task,防止意外访问
Result := TaskResult; //主线程返回最终结果
end;

restful 服务器一个问题,看ChatGPT的威力的更多相关文章

  1. 从高处理解android与服务器交互(看懂了做开发就会非常的容易)

    今天帮一个朋友改一个bug 他可以算是初学者吧 .我给他看了看代码,从代码和跟他聊天能明显的发现他对客户端与服务器交互 基本 不是很了解.所以我花了更多时间去给他讲客户端与服务器的关系.我觉得从这个高 ...

  2. XML的应用 ---- 从一个范例看xml数据、xsd验证、xslt样式

    从一个范例看XML的应用 引言 如果你已经看了Asp.Net Ajax的两种基本开发模式 这篇文章,你可能很快会发现这样一个问题:在那篇文章的方式2中,客户端仅仅是发送了页面上一个文本框的内容到服务端 ...

  3. 一个故事看懂HTTPS

    我是一个浏览器,每到夜深人静的时候,主人就打开我开始学习. 为了不让别人看到浏览记录,主人选择了"无痕模式". 但网络中总是有很多坏人,他们通过抓包截获我和服务器的通信,主人干了什 ...

  4. 另一个角度看元宇宙与RPA:人工世界、平行员工与RPA

    另一个角度看元宇宙与RPA:人工世界.平行员工与RPA 从元宇宙到平行员工,人工世界推动的虚实分工利好RPA 机器人是铁打营盘人类是流水兵,未来元宇宙的虚实分工RPA机会巨大 文/王吉伟 元宇宙是平行 ...

  5. 三分钟搭建一个自己的 ChatGPT (从开发到上线)

    原文链接:https://icloudnative.io/posts/build-chatgpt-web-using-laf/ OpenAI 已经公布了 ChatGPT 正式版 API,背后的新模型是 ...

  6. 免费1年服务器,部署个ChatGPT专属网页版

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 白皮袄个免费1年服务器,部署个ChatGPT专属网页版! api.openai.com por ...

  7. 在云服务器上搭建个人版chatGPT及后端Spring Boot集成chat GPT

    总结/朱季谦 本文分成两部分,包括[国内服务器上搭建chat GPT]和[后端Spring Boot集成chat GPT]. 无论是在[国内服务器上搭建chat GPT]和[后端Spring Boot ...

  8. 廖雪峰js教程笔记6 generator一个坑 看完python在回来填坑

    generator(生成器)是ES6标准引入的新的数据类型.一个generator看上去像一个函数,但可以返回多次. ES6定义generator标准的哥们借鉴了Python的generator的概念 ...

  9. Spark小课堂Week7 从Spark中一个例子看面向对象设计

    Spark小课堂Week7 从Spark中一个例子看面向对象设计 今天我们讨论了个问题,来设计一个Spark中的常用功能. 功能描述:数据源是一切处理的源头,这次要实现下加载数据源的方法load() ...

  10. zz:一个框架看懂优化算法之异同 SGD/AdaGrad/Adam

    首先定义:待优化参数:  ,目标函数: ,初始学习率 . 而后,开始进行迭代优化.在每个epoch  : 计算目标函数关于当前参数的梯度:  根据历史梯度计算一阶动量和二阶动量:, 计算当前时刻的下降 ...

随机推荐

  1. Solution Set - “谁将重力悬空,坠入一场蔚蓝的梦”

    目录 0.「NOI Simu.」皮配 1.「BZOJ #4671」异或图 2.「CF 1158F」Density of subarrays 3.「CF 794G」Replace All 4.「UR # ...

  2. Springboot集成-ClickHouse

    1.clickhouse应⽤场景 1.绝大多数请求都是用于读访问的 2.数据需要以大批次(大于1000行)进行更新,而不是单行更新:或者根本没有更新操作 3.数据只是添加到数据库,没有必要修改 4.读 ...

  3. Java虚拟机调优-垃圾回收算法-工具

    背景: 垃圾回收的瓶颈 传统分代垃圾回收方式,已经在一定程度上把垃圾回收给应用带来的负担降到了最小,把应用的吞吐量推到了一个极限.但是他无法解决的一个问题,就是Full GC所带来的应用暂停.在一些对 ...

  4. Event Store-其它存储

    背景 ENode是一个CQRS+Event Sourcing架构的开发框架,Event Sourcing需要持久化事件,事件可以持久化在DB,但是DB由于面向的是CRUD场景,是针对数据会不断修改或删 ...

  5. java代码之美(2)

    guava 复写Object常用方法 Guava 是一个 Google 的基于java1.6的类库集合的扩展项目,这个库提供用于集合,缓存,支持原语,并发性,常见注解,字符串处理,I/O和验证的实用方 ...

  6. Readys pg walkthrough Intermediate

    nmap ┌──(root㉿kali)-[~] └─# nmap -p- -A 192.168.175.166 Starting Nmap 7.94SVN ( https://nmap.org ) a ...

  7. Vanity Intermediate 统配符提权

    nmap扫描 ┌──(root㉿kali)-[~] └─# nmap -p- -A 192.168.167.234 Starting Nmap 7.94SVN ( https://nmap.org ) ...

  8. delphi编写sql脚本文件批量执行程序

    程序使用DelphiXE11.1开发,用到控件UniDac9.1.1,QDAC里面的Qlog组件. 程序实现了SQL脚本文件批处理执行应用,运行效果图. 文件.pas代码 unit main; int ...

  9. Linux环境下安装phantomjs

    一.创建文件夹,用来存放软件 cd /opt/softWare mkdir  phantomJS cd phantomJS 二.下载并解压 wget https://bitbucket.org/ari ...

  10. Hive表误删恢复

    一.简介 因hive表删除后,hdfs文件会先放入回收站,定期清理回收站.在回收之前可以进行清理数据 二.恢复步骤 2.1 看表存储是否损坏select type from dw.ods_test1 ...