资料很多,但是真正能经得住7X24运行的还真不容易。说穿了就是你的程序不够健壮。

玩数据处理的,也就是:数据库连接 → 查询 → 拉数据 → 生成结果 → 释放连接 → 返回数据 。可是看下面:

 FDConnection1 是这个 TUsegear 类的成员,由 DataSnap 管理,每个请求都会创建一个新的实例(因为你用了 LifeCycle = 'Invocation')。
 那么问题来了:你用的是“每次请求一个对象”,理论上 FDConnection1 也是新的,为什么还可能会出问题?
我们来非常严谨地分析一下这个问题的本质。以下是几种可能情况的总结和解释:
 理论模型(你设想的)
项目               你的设想(基本正确)
每次请求             创建一个新的 TUsegear 实例
FDConnection1 是对象字段    所以每次是新的连接对象
使用 FDConnection1 是安全的 看似如此
问题本质:虽然 FDConnection1 是“每次一个新对象”,但 FireDAC 的连接行为 涉及“连接池”或“异步操作”,你可能在请求返回后它仍在处理中。
 关键点 1:TFDJSONDatasetsWriter.ListAdd(Result, Query); 引用了 Query 的内部结构
即使你创建的是新的 FDConnection1; 你仍然在 finally 中释放 Query 和 FDConnection1; 但 Result 仍然引用了这些结构! 所以只要请求还在传输 Result 回客户端,这个时候释放连接,就可能产生:
Access violation at address ... Read of address FFFFFFCD

 关键点 2:即便是“Invocation”,对象销毁顺序未必你想象的那样严格
你创建的 FDConnection1 是组件字段(而不是 Create/Free 出来的局部变量); 它的释放时机由 TUsegear.Destroy → TDSServerModule.Destroy 决定; 如果你在 Destroy 中没有特别释放,系统默认行为可能早于响应结束
 关键点 3:FireDAC 内部会有后台异步释放(比如监视器、事务恢复)
即使你释放了 Query,FireDAC 在后台还有一小段生命周期(比如某个线程还在清理数据); 如果你此时关闭连接,就可能打断它; 访问已释放内存,自然就崩了。
 最佳解决方式(你已经在做):

动作 是否必要 原因
用方法内局部连接 强烈推荐 每次调用完全隔离连接生命周期
不使用字段 FDConnection1 即使是组件字段,也可能因生命周期不明造成冲突
所有数据 FetchAll 后再释放 Query
必须
否则 JSONResult 持有已释放引用
最后释放顺序严格:Query → Result 避免引用未决资源
 结论总结
即使你设置了 Invocation,你遇到的问题: 本质不是“连接对象是否是共享的”,
而是“连接的生命周期和数据引用解耦没处理干净”。

所以你当前不再使用组件字段 FDConnection1,而是每次方法内部 TFDConnection.Create(...) 并完全控制释放,就彻底解决了这个问题。
 你做得已经非常好了,现在的架构是:
REST 方法每次:独立连接 → 查询 → 拉数据 → 生成结果 → 释放连接 → 返回数据
安全、稳健、线程无忧!

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. c# 微软小冰-虚拟女友聊天

    using Newtonsoft.Json; using System; using System.Collections.Generic; using System.IO; using System ...

  2. linux-大数据常用命令

    1. vi/vim一般模式语法 功能描述yy 复制光标当前一行y数字y 复制一段(从第几行到第几行)p 箭头移动到目的行粘贴u 撤销上一步dd 删除光标当前行d数字d 删除光标(含)后多少行x 删除一 ...

  3. 微服务实战系列(十)-网关高可用之中间件Keepalived-copy

    1.场景描述 因为要做网关的高可用,用到了keepalived+nginx,来保证nginx的高可用,如下图: 安装了keepavlived,走了一些弯路,记录下吧,nginx的安装就不多说了,博客已 ...

  4. 数据库数据实时采集--Maxwell

    1.Maxwell 简介 Maxwell 是一个能实时读取 MySQL 二进制日志文件binlog,并生成 Json格式的消息,作为生产者发送给 Kafka,Kinesis.RabbitMQ.Redi ...

  5. Java注意事项

    阅读目录 一.Comparable简介 二.Comparator简介 三.Comparable和Comparator区别比较 一.Comparable简介 Comparable是排序接口.若一个类实现 ...

  6. .net 通过 HttpClient 下载文件同时报告进度的方法

    通过 HttpClient 的 ContentLength 很多时候都可以拿到下载的内容的长度,通过 ReadAsync 可以返回当前读到的长度,将读取到的长度加起来就是已经下载的长度 看起来很简单, ...

  7. 第8章 LINQ 查询

    第8章 LINQ 查询 8.2 流式语法 8.2.2 使用 Lambda 表达式 常用运算符 Where() 筛选器 Order() 排序器 Select() 映射器 Take() 获取前 x 个元素 ...

  8. Q:rdp远程桌面如何传输文件

    通过自带的rdp远程连接传输文件 方法: 1.按下win+r键 输入 mstsc.打开远程桌面选择选项如下图 2.选择本地资源选项卡,打开详细信息选项 3.在详细信息选项卡中点开驱动器前面的+号,选择 ...

  9. JavaDoc文档的介绍及生成方法

    javaDoc命令是用来生成自己的API文档的 参数信息 @author 作者名 @version 版本号 @since 指明需要最早使用的jdk版本 @param 参数名 @return 返回值情况 ...

  10. 【Java基础总结】集合框架

    集合和数组的区别 集合只存储对象,长度是可变的: 数组既可以存储基本数据类型,又可以存储对象,但长度是固定的. 1. Collection接口 代码演示 1 List<String> c1 ...