我正在构建一个使用 cfhttp 读取分隔日志文件的脚本。这些日志文件往往相当大,因此当我尝试将日志文件中的数据插入到我创建的表中时,我的 cfquery insert 语句超时。
所以,我解决这个问题的想法是一次插入 200-300 条记录,然后以某种方式刷新插入语句计时器,然后导入下一组 200-300 条记录。
我不完全确定如何做到这一点。
每个人都处理过从日志文件中导入数千个条目的问题吗?您是如何克服 cfquery 标记中的超时问题的。
我正在构建一个使用 cfhttp 读取分隔日志文件的脚本。这些日志文件往往相当大,因此当我尝试将日志文件中的数据插入到我创建的表中时,我的 cfquery insert 语句超时。
所以,我解决这个问题的想法是一次插入 200-300 条记录,然后以某种方式刷新插入语句计时器,然后导入下一组 200-300 条记录。
我不完全确定如何做到这一点。
每个人都处理过从日志文件中导入数千个条目的问题吗?您是如何克服 cfquery 标记中的超时问题的。
我不是 100% 确定这对你有用,但是对于将日志文件数据导入数据库的核心任务,我会绕过 ColdFusion 完全解析数据的步骤。
看看直接从 SQL 执行它。
首先在本地复制您的文件,也许使用<cfftp/>
然后,将您的日志文件视为 CSV 文件,并编写一个您可以通过 CF 执行的 SP,它将您的日志数据读入临时表。这应该很快并且避免任何超时。
然后,您可以有一个单独的步骤(也许再次在 SQL 中)在临时表中重新组织您的数据。
希望有帮助。
Cold Fusion 可以传递 SQL server 使用的 Batch Insert 命令,您只需要确保您正在使用的 dB 服务器上允许该功能。我建议将文件引入本地并使用 SQL Server 的批量插入功能。
如果您可以将文件加载到会话变量中,则可以使用 cfloop 每次调用的 startrow 和 endrow 属性一次解析行。然后,您将设置脚本以设置计数器,执行第一次传递,更新计数器,然后使用 cfhttp 再次将信息发送到您的进程,并传入 udpated 计数器。然后该过程将只解析这些行并进行插入。
对于大量数据,并且取决于数据库,您可以考虑创建一个存储过程,您可以一次将整个数据块传入,例如 XML。然后,您的 sproc 将从 XML 字段向您的表中执行一条插入语句。
这将加快处理速度,并且不会导致 CF 超时。
首先检查它是数据库超时而不是http请求。您是否在 cfloop 中一次插入 1 个记录?你有你要插入的表的索引吗?尝试在一个插入语句中插入多条记录。