当 PostgreSQL 停止时,TFDConnection.OnRecover 永远不会被触发

2024-02-01

我使用了 Firedac 连接恢复功能,如下所述恢复连接 (FireDAC) http://docwiki.embarcadero.com/RADStudio/Rio/en/Recovering_Connection_(FireDAC)Delphi XE5 一切正常。

我安装了 Delphi 社区版本 10.2、10.3 和 10.3.1 进行迁移测试,发现数据库重新连接功能无法正常工作。

使用场景:

  • Windows 10 专业版 X64 1803
  • 德尔福10.2 / 10.3 / 10.3.1
  • PostgreSQL 9.5.16 x64

重现问题的步骤:

1 - 创建一个新的VCL应用程序;

2 - 在 Form1 上,放置组件 TFDConnection、TFDPhysPgDriverLink、TFDGUIxWaitCursor、TFDQuery 和 TButton;

3 - 使用 PostgreSQL 的连接参数和 TFDPhysPgDriverLink 的供应商库 libpq.dll 配置 TFDConnection;

4 - 按照以下所述配置 TFDConnection恢复连接 (FireDAC) http://docwiki.embarcadero.com/RADStudio/Rio/en/Recovering_Connection_(FireDAC);

5 - 在 TButton OnClick 事件中放置以下内容:

qry1.Close;
qry1.Open ('select 1');

6 - 在 TFDConnection 的 OnRecover 事件中放置以下代码,如所述恢复连接 (FireDAC) http://docwiki.embarcadero.com/RADStudio/Rio/en/Recovering_Connection_(FireDAC):

var
  iRes: Integer;
begin
  iRes: = MessageDlg ('Connection is lost. Offline - yes, Retry - ok, Fail - Cancel', mtConfirmation, [mbYes, mbOK, mbCancel], 0);
  case iRes of
    mrYes: AAction: = faOfflineAbort;
    mrOk: AAction: = faRetry;
    mrCancel: AAction: = faFail;
  end;
// Log ('Connection is recovering');

7 - 运行应用程序;

8 - 单击按钮一次;

9 - 重新启动 PostgreSQL 服务或禁用/重新启用网络适配器;

10 - 再次单击 TButton,请注意 TFDConnection 组件没有触发 OnRecover 事件,而是显示以下错误:

[FireDAC] [Phys] [PG] [libpq] 服务器关闭了连接 意外 这可能意味着服务器异常终止 在处理请求之前或期间。

再次单击 TButton 每次都会显示另一个错误:

[FireDAC] [Phys] [PG] [libpq] 没有连接到服务器

预先感谢您对此进行审阅。

这个问题与我的情况相似,但它是针对 Delphi 10 的:当 PostgreSQL 停止时 TFDConnection.Connected 保持 True https://stackoverflow.com/questions/46827156/when-postgresql-stops-tfdconnection-connected-remains-true


我根据RSP-23958向Embarcadero质量中心报告了这个问题,并且该错误已得到解决。一个叫 Dmitry 的人回答说这个问题将在 Delphi 10.3 的更新 2 中得到解决。

在 RSP-23958 中,附加了一个解决该问题的修复补丁,如果您有带有 Firedac 源代码的 Dephi,并且 Delphi 10.3 update 2 尚未发布,则可以使用它。

修复方法如下:

Index: runtime/data/firedac/FireDAC.Phys.PGWrapper.pas
===================================================================
--- runtime/data/firedac/FireDAC.Phys.PGWrapper.pas (revision 95224)
+++ runtime/data/firedac/FireDAC.Phys.PGWrapper.pas (revision 95225)
@@ -1109,7 +1109,9 @@
      FDStrLike(sLCMessage, 'password authentication failed for user "%"') then
     eKind := ekUserPwdInvalid
   else if (Pos('connection refused', sLCMessage) <> 0) or
-          (Pos('could not connect to server', sLCMessage) <> 0) then
+          (Pos('could not connect to server', sLCMessage) <> 0) or
+          (Pos('server closed the connection unexpectedly', sLCMessage) <> 0) or
+          (Pos('no connection to the server', sLCMessage) <> 0) then
     eKind := ekServerGone
   else
     eKind := ekOther;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当 PostgreSQL 停止时,TFDConnection.OnRecover 永远不会被触发 的相关文章

  • 如何释放 TInterfacedObject 中的 TObject 成员

    我知道接口对象是引用计数的 因此不需要手动释放它 但如果它有一个 TObject 继承成员 我是否应该在析构函数中手动释放该成员 考虑以下代码 program Project2 APPTYPE CONSOLE R res uses Syst
  • Delphi 2010 - 从 XML 文档解码 Base64 编码图像

    我正在尝试从应用程序中的 XML 文档解码 base64 编码的 EMF 图像并将其呈现在屏幕上 但是 它似乎从未出现 如果我将 XML 文档中的数据复制 粘贴到 Notepad 中并使用Base64 Decode选项并将文件另存为 emf
  • 从 Delphi VCL 样式获取特定字形

    我想从 VCL 样式获取特定的位图 并将其设置为按钮上的图像 它实际上是帮助问号 在位图样式编辑器中是来自表单的 btnHelp 图像 要从 VCL 样式获取视觉元素 字形 您必须使用GetElementDetails和TCustomSty
  • Delphi XE7 Android 全屏(隐藏软键)

    如何在XE7中全屏显示 隐藏顶部 标题 和底部 软键 工具栏 在 XE6 中 我可以通过在应用程序部分写入来调整 AndroidManifest 以使我的应用程序全屏显示并且没有操作栏 android theme android style
  • Delphi 中表单分发与其生命周期相关的接口对象的安全方法?

    我有一个 Delphi 表单 它提供接口对象背后的功能 代码的其他部分也通过属于该表单的属性获取引用 我无法将接口功能委托给子对象 因为太多的功能是由表单上的控件 组件提供的 我无法使用 TAggregateObject 或 TContai
  • Delphi - Indy - 保存 GMail 草稿

    我一直在 Delphi 下使用 Indy 通过 gmail 帐户发送消息 使用 TIdSMTP 和 TIdMessage 组件 这绝对没问题 但是 我的客户请求将消息保存到 DRAFTS 文件夹 以便他在实际发送消息之前对 以编程方式创建的
  • 如何读取和更改 TEdit 控件的值?

    我有一个表格TForm1有 5TEdit and 2 TBitBtn 我还需要该程序 以便在输入数字数据后Edit1 and Edit2 on BitBtn1Click Edit1 and Edit2值将被求和并显示在Edit3 你想做这样
  • FireMonkey iOS RAD Studio XE2 - 在从 URL 加载的表单上显示图像

    是否可以将 TImage 放置在 iOS 的 FMX 表单上 并将图像 jpg 从 URL 加载到此 TImage 中以在 iOS 应用程序中显示 我尝试过但没有成功 任何正确方向的提示或指出都会受到赞赏 将 TButton TImageC
  • Delphi 7 - 处理表单中嵌入框架的 MouseWheel 事件?

    你好 我有一个表格 里面有几个框架 对于某些框架 我希望滚动内容 或至少处理鼠标滚轮事件 我已经尝试过以下方法 只需为每个帧分配一个 OnMouseWheel 事件处理程序 重写父窗体的 MouseWheel 事件 procedure TF
  • 似乎有时 Delphi 是区分大小写的 - “覆盖方法应该与祖先的大小写匹配”

    今天我遇到了一个 奇怪 的提示 覆盖方法 xxxx 应匹配祖先 yyyy 的大小写 解决方案是完全按照祖先中的方式声明方法名称 我相信这是自 Delphi Net 编译器以来编译器中保留的东西 与祖先中完全相同的方法声明方法使编译器 沉默
  • TFrame继承重构

    我提出的另一个 TFrame IDE 注册组件问题 感谢各位程序员的帮助 尝试 Darrian 的 TFrame 继承建议here https stackoverflow com questions 382562 delphi visual
  • Delphi Prism 中 TStringList 的替代品。

    我正在将用 Delphi 2007 Net 编写的应用程序迁移到 Delphi Prism 哪个是替换 TStringList 和 TStrings 类的最佳选择 提前致谢 Bye 只需使用 NET 框架中内置的 List 类型 或者字符串
  • 使用 Delphi 10.2.1 Tokyo 的模态 Android 对话框

    我有以下用于在 Android 上显示模式消息的 Delphi 代码 该代码在 10 1 Berlin 上运行良好 但在 Delphi 10 2 1 Tokyo 上停止运行 此过程现在会挂起 Android 应用程序 procedure c
  • 面向 Delphi 开发人员的 Qt

    有人知道为 Delphi C Builder VCL 开发人员解释 Qt 的书籍或教程吗 对于具有该背景的开发人员来说 学习 Qt 的最佳方法是什么 我对如何使用 Qt 完成我知道如何在 Delphi 中完成的事情特别感兴趣 例如 Qt 相
  • 德尔福和Doxygen

    我想使用 doxygen pas2dox 记录我的源代码 当我设置好所有内容 包括过滤器和提取选项 提取所有内容 时 doxygen 运行良好 但生成的文档仅包含源文件作为链接 并且没有提取类型 方法 过滤后的源看起来不错 有任何提示如何定
  • VirtualStringTree 正确/推荐使用

    我已经使用 virtualstringtree 一段时间了 我将它用于两个不同的用途 第一个是用于选择 显示数据的普通树 第二个是作为网格来显示 SQL 语句的输出 我加载到树中的所有数据都来自数据库 对于树示例 我有一个 ParentId
  • Soap Delphi 客户端因 1MB 调用超时而结束

    我们正在开发 SOAP Web 服务 Apache PHP 所有小规模调用都运行良好 但对于 1Mb 的 Soap 调用 HTTPS 调用大小为 1MB 我们的 Delphi Soap 客户端在除一台 PC 之外的所有 PC 上都因超时而停
  • 如何检查文件是否有备用数据流?

    Delphi 有没有办法检查文件是否有任何备用数据流 看一下 Win32 APIFindFirstStreamW https msdn microsoft com en us library windows desktop aa364424
  • 从不同的形式调用过程

    我正在使用 Lazarus 我有一个名为TForm1单元名称为 Unit 1 在这里我有一个名为mergeDATfile a shortint 这会产生一些东西 顺便说一句 我必须创建另一个名为TForm2里面有按钮 Button1 当它被
  • 指针^ 与 s[1]

    在读取数据的函数中 数据含义只字符串 从磁盘 我应该更喜欢哪个 哪个更好 A DiskStream Read Pointer s Count or B DiskStream Read s 1 Count Note 我知道两者都有相同的结果

随机推荐

  • 如何推迟shared_ptr的删除操作?

    我创建了一个指针sample主要类 我正在将此指针传递给函数function1 该函数必须使用指针作为共享指针并使用该指针执行一些操作 退出期间function1 的析构函数sample由于调用shared ptr 当我将相同的指针传递给不
  • 实现自定义 LINQ-to-X 提供程序

    我有一个搜索工具 它接受复杂的搜索字符串 实际上是 JSON 中的 n 级对象图 并返回一些结果 我想通过类似 LINQ 的机制向其他 内部 开发人员公开该功能 假设每个结果都是由一个类定义的Result 我可以创建类似以下的方法 Func
  • Google+ 的共享意图无法访问图像

    我正在调用共享图像的意图 这适用于大多数提供商 但适用于 Google Google 打开不带图片的帖子活动 并显示 Toast 您只能发布存储在设备上的照片 同时 File f storeImage image f data data c
  • 在头文件与 .cpp 文件中编码 C++(主要)

    多年来 我一直以标准方式编写 C 代码 在头文件 hpp 中使用类声明 在源 cpp 文件中使用函数定义 最近 我搬到了一家新公司 其中的代码 似乎受到 boost 编码风格的影响 完全用 hpp 文件进行编码 并用一个短的 cpp 文件来
  • Visual Studio Extensions - 支持多个版本的VS

    我一直在编写一个扩展 编辑器分类器项目 带有一些其他功能 它在 VS2013 上运行良好 但我需要支持其他版本 VS2012 和 VS2015 当它超出预览时 当我刚刚添加支持的版本时vsixmanifest 我面临的问题是 出口ITest
  • js函数不调用自动填充函数

    我有一个输入字段 其中包含州名称并在其他字段上显示相应的区域 当我更改状态字段的值时 区域的值也应该更改 它不适用于我的代码 这有什么问题 div class col md 4 form group style padding right
  • MongoDb 使用位置运算符拉取

    我的文档结构如下 id 12342342 items ownerId 123 dates 2014 10 01 2014 10 02 ownerId 234 dates 2014 10 01 2014 10 02 我想从父对象的ownerI
  • 低延迟、大规模消息队列

    我正在重新思考 Facebook 应用程序和云计算时代的大型多人游戏 假设我要在现有开放协议之上构建一些东西 并且我想为 1 000 000 个同时玩家提供服务 只是为了解决问题 假设每个玩家都有一个传入消息队列 用于聊天等 平均还有一个传
  • 查找带有 USB 设备 VID/PID 的 /dev 条目

    我想制作一个程序来检测哪些 dev sd 条目链接到已知的 USB VID PID 对 你知道我如何获得 USB 记忆棒的 VID PID 吗 dev sd 您可以使用udevadm为了这 在输出中udevadm info q proper
  • 通过 UIBezierPath 移动 CALayer

    我有一个图层将从 UIBezierPath 上的 A 点移动到 B 点 我发现了很多涉及 CAAnimation 和 UIBezierPath 的示例 但我只需将图层从指定点移动到贝塞尔曲线路径上的另一个点 任何建议 将不胜感激 Thank
  • 裁剪图像时添加细白线 (Objective-C OSX)

    我正在剪切一张大图像并将其保存为许多不同的图像 我首先在iOS它工作正常 但是当我尝试将代码移植到OSX 一条细白线 1 像素 出现在图像的顶部和右侧 该线不是纯白色或实线 参见下面的示例 这里是iOS制作一个子图像的代码 就像冠军一样 v
  • 如何从 HIVE 中的日期减去月份

    我正在寻找一种方法来帮助我从 HIVE 中的日期中减去月份 我有个约会2015 02 01 现在我需要从这个日期减去 2 个月 这样结果应该是2014 12 01 你们能帮我一下吗 select add months 2015 02 01
  • BigQuery 选择 * 两列除外

    我想从公共 BigQuery github repos 数据集中选择除以下两条记录之外的所有内容 author nameAND差异 old mode 根据我问的类似问题 我想我想运行类似于 standardSQL SELECT REPLAC
  • 如何仅在functions.auth.user().onCreate完成后完成登录

    我正在使用 firebase 函数 并且有一个在用户创建时添加新集合的函数 问题是有时用户在功能完成之前登录 因此用户已登录但尚未创建新集合 然后我收到错误消息 缺少或权限不足 因为规则找不到该集合 我该如何处理 仅当所有内容都来自时 是否
  • 在表格单元格内垂直拉伸 div - IE8

    如何在表格单元格内垂直拉伸 DIV 我想height 100 就可以了但在某些情况下 事实并非如此 至少在 IE8 中 这是一个简单的例子 一个 3 行表格 包含页眉 内容和页脚 我希望 内容 单元格内的 内容 DIV 垂直拉伸 100 在
  • 如何组合 kotlin 委托属性:可观察、可否决和“按映射”?

    我正在尝试结合代表 可观察的 https kotlinlang org api latest jvm stdlib kotlin properties delegates observable html with vetoable http
  • .NET Framework 4.0 安装程序是否也安装了 .NET 3.5?

    NET 4 0 旨在与 3 5 并行运行 并且不会运行 3 5 应用程序 这让我担心必须指示我的用户下载 NET 3 5 而不仅仅是 最新版本 我在一篇博客中读到 如果尚未安装 4 0 安装程序也会安装 3 5 但我现在无法测试它 有人尝试
  • 如何使用 XPath 和 Java 更新 XML

    我有一个 XML 文档以及该文档的 XPath 表达式 我必须在运行时使用 XPath 更新文档 我如何使用 Java 来做到这一点 下面是我的xml
  • pytorch 中图像分割的通道明智 CrossEntropyLoss

    我正在做图像分割任务 总共有 7 个类 所以最终的输出是像 batch 7 height width 这样的张量 它是一个 softmax 输出 现在直觉上我想使用 CrossEntropy 损失 但 pytorch 实现不适用于通道明智的
  • 当 PostgreSQL 停止时,TFDConnection.OnRecover 永远不会被触发

    我使用了 Firedac 连接恢复功能 如下所述恢复连接 FireDAC http docwiki embarcadero com RADStudio Rio en Recovering Connection FireDAC Delphi