我已经阅读了一些/很多关于此的内容,但它们似乎并没有太大帮助。
我有一个应用程序(它被称为“TieUp”,但这无关紧要)我每天手动运行它以整理来自多个位置的数据。
它用作来源:
A) 来自远程 SOAP 源并通过 XMLtransform 设置加载到内存中的 TClientDataset 的数据。
B) CSV 文件每天下载并加载到内存中的 TClientDataset
C)与程序在同一台计算机上的 Mysql 数据库(它是实时源的还原备份)
D) 远程 MS-SQL (SQLServer 2008) 数据库
E) 远程服务器上的 Mysql 数据库
仅从源 A、B、C 和 D 读取数据 使用合并数据更新数据源 E。
每天有 800 到 2000 条记录,因此数据集并不庞大,尽管目标 (E) 已增长到大约 150,000 条并且每天都在增加。
我通常可以愉快地运行这一切,并且由于对 MS-SQL 系统的所有单独远程查找,一切都按预期运行)但有时它真的搞砸了,错误总是“灾难性失败!”。
在我可以看到的任何特定阶段或操作期间都不会发生故障。步骤是:
1) 首先获取 SOAP(A) 数据。
2) 与 CSV/内存数据 (B) 相关联。
3) 查找源 C 和 D 上的引用数据以进行整理
4) 将合并后的数据写入源 E
在将数据读入内存数据集之后,每件事都在 TClientDatasets 中,通过链接到 TSQLQueries 的 DatasetProviders 访问(它们目前都在同一台服务器上,但我这样做是为了在未来可能真正实现三层时保持一定的灵活性)。所有查询都包含在 SQLQuery 组件中,因为它们实际上非常简单 - 只需将事物捆绑在一起即可。
我使用的是 Delphi 2009 Enterprise 的完全标准组件。已应用所有更新和数据库更新包。每个数据源都有自己的 DataModule 这些是在启动时自动创建的
显然这里正在进行大量的数据访问,但是当它崩溃(发生灾难性故障)时,它会卡住,完全卡住。Windows 无法从正常的“TieUp 已停止工作”结束任务,我必须去进程并杀死它。
发生了很多事情,因为这种情况每周只发生一次左右,所以我真的不知道从哪里开始寻找。
问这个问题的原因有两个:1)是我试图消除任何手动的东西并完全自动化它,但如果每周左右都有炸弹,我不能依赖它。2)如果它发生在 E 的更新阶段 - 我必须手动删除当天的新记录并重新开始,因为我没有(或尚未编写)从随机点重新启动的机制,我会仍然必须手动查询数据库以确定该点。
我的下一步是在另一台计算机上安装 Delphi 并始终在调试器下运行它,直到我可以捕获它,如果它没有先冻结。但这引入了另一种不同的网络连接(而不是本地主机连接)。
所以:“有确定的答案吗?” 或者最有可能有问题的组件/连接是什么?最喜欢从哪里开始寻找?
提前致谢...