Sql server 2005 如何在Coldfusion中加速批处理作业?

Sql server 2005 如何在Coldfusion中加速批处理作业?,sql-server-2005,stored-procedures,coldfusion,batch-file,Sql Server 2005,Stored Procedures,Coldfusion,Batch File,每隔一段时间,我就会收到一个大数据文件,我的客户会上传这个文件,需要通过CMFL进行处理。问题是,如果我将处理放在CF页面上,那么它会在120秒后遇到超时问题。我能够将处理代码移动到一个CFC,它似乎没有超时问题。但是,在处理过程中的某个时候,它会导致ColdFusion崩溃,并且必须重新启动。对于我处理的文件的每一行(8000+),以及我以CFML形式提供的其他逻辑,都需要大量的数据库查询(5个或更多,更新和选择的混合) 我的问题是什么是浏览这个文件的最佳方式。需要注意的是,我无法将文件移动到

每隔一段时间,我就会收到一个大数据文件,我的客户会上传这个文件,需要通过CMFL进行处理。问题是,如果我将处理放在CF页面上,那么它会在120秒后遇到超时问题。我能够将处理代码移动到一个CFC,它似乎没有超时问题。但是,在处理过程中的某个时候,它会导致ColdFusion崩溃,并且必须重新启动。对于我处理的文件的每一行(8000+),以及我以CFML形式提供的其他逻辑,都需要大量的数据库查询(5个或更多,更新和选择的混合)

我的问题是什么是浏览这个文件的最佳方式。需要注意的是,我无法将文件移动到数据库服务器并完全用DB处理它。但是,将每一行传递给处理所有事情的存储过程是否会更有效?这将仍然是对数据库的大量调用,但与我现在拥有的相比什么都没有。另外,向用户提供有关文件处理量的反馈的最佳方式是什么

编辑:
我正在运行CF 6.1,SQL Server Integration Services(SSIS)是推荐用于复杂ETL(提取、转换和加载)工作的工具,这听起来就是这样。(可以将其配置为访问其他服务器上的文件。)问题可能是,您能否在Cold Fusion和SSIS之间建立一个接口?

我刚刚做了类似的事情,经常使用CF进行数据解析

1) 维护文件上载表(父表)。对于您上载的每个文件,您应该能够保留每个文件的列表及其状态(已上载、已处理、未处理)

2) Temp表来存储数据文件的所有行。(子表)将整个数据文件导入到临时表中。试图在内存中完成这一切将不可避免地导致一些错误。此表中的每一行都将链接到上面的文件上载表条目

3) 维护处理状态-对于您引入的数据文件的每一行,设置一个“处理/未处理”标记。这样,如果它坏了,你可以从你停止的地方开始。在运行每一行时,将其设置为“已处理”

4) 事务-如果可能,使用cftransaction一次提交所有事务,或者一次至少提交一行(使用5个查询)。这样一来,如果某件事情突然发生,您就不会有一行数据被计算/处理/更新/测试了一半

5) 完成处理后,将步骤1中表中的文件名条目设置为“已处理”

通过使用上述方法,如果出现故障,您可以将其设置为从停止的位置开始,或者至少有一个更清晰的开始调查的路径,或者在最坏的情况下清理数据。您将有一个清晰的方式向用户显示当前上传处理的状态,它在哪里,以及如果出现错误,它在哪里停止

如果你有任何问题,请告诉我

其他想法:

  • 你可以增加超时,给虚拟机更多的内存,把它放在64位,但所有这些只会增加你的系统容量这么多。这是一个好主意,做这些每一个电话,并结合上述

  • Java有一些整洁的文件处理库,可以作为CFC使用。如果在速度方面遇到很多问题,可以使用其中一个将其读入变量,然后读入数据库

  • 如果您正在使用XML,请不要使用coldfusion的XML解析。它适用于较小的文件,并且在文件变大时适用。这里有几个cfc(检查Riafforge等),它们包装了一些优秀的java库,用于解析xml数据。然后,如果需要使用此数据,您可以手动创建cfquery


  • 没有更多的信息很难说,但根据你所说的,我提出了三个想法

    首先,由于有这么多的数据库操作,您可能生成了太多的调试。确保在administrator中的“调试输出设置”下关闭以下设置

    • 启用健壮的异常信息
    • 启用AJAX调试日志窗口
    • 请求调试输出
    我要做的第二件事是查看那些DB查询,并确保它们是优化的。确保正在使用标记等进行选择

    我怀疑的第三件事是,挂在内存中的文件可能不太理想

    我会尝试使用文件循环来循环文件:

    <cfloop file="#VARIABLES.filePath#" index="VARIABLES.line">
        <!--- Code to go here --->
    </cfloop>
    

    如果您可以升级到cf8并利用cfloop file=“”,这将提高您的速度,并且文件不会被放入内存中(这可能是崩溃的原因)


    根据您遇到的情况,您也可以使用cfthread来加快处理速度。

    您尝试过事件网关吗?我相信这些线程不受与页面请求线程相同的超时设置的约束。

    目前,事件网关是绕过HTTP请求周期超时限制的唯一方法。CF没有脱机处理CF页面的方法,也就是说,没有命令行调用(我对CF最大的抱怨之一——很少脱机处理)


    你最好的选择是使用事件网关或用纯Java重写解析逻辑。

    我也必须做同样的事情,Ben Nadel已经写了很多关于使用Java文件io的文章,让你能够更快地读取文件、写入文件等


    确实有助于提高csv导入应用程序的性能。

    我相信您可以设置一个请求参数,将超时时间增加到您选择的值。您尝试过了吗?我很确定还有一个命令允许您从命令行执行CF页面-没有使用过