我们有一个定期读取CSV文件并将记录插入Oracle 11g数据库的ColdFusion 9脚本。 CSV文件大约有50列,其中8个由CF使用(CSV格式不能修改)。该CFM的一般流程是:读取用于数据库导入的csv文件时ColdFusion内存尖峰化
- 读取使用该变量作为与CHR作为分隔符的列表属性(13)文件导入可变
- CFLOOP
- 呼叫Oracle存储过程中插入来自各个值使用ListGetAt
存储过程文件执行下列操作:
- 插入具有2网络连接的记录视场为表1
- 插入8个领域(包括表1的主键)为表2
- 没有返回值
这成功地运行在大多数情况下,阅读数以百计的记录400页KB的文件记录只需几秒钟。但是,偶尔我们会得到一个大容量,并且最终创建一个13k创纪录的5MB文件。当我们尝试处理一个这样大的文件时,我观察到JVM的内存使用量在10-15秒内从90MB增加到680MB左右,之后CF服务器监视器停止响应(CF也如此),迫使我们重新启动服务。日志报告JVM内存不足错误:
"Error","qtp4795249-38798","12/28/11","16:29:20",,"GC overhead limit exceeded" java.lang.OutOfMemoryError: GC overhead limit exceeded
我们的JVM堆大小目前是768MB。我还没有尝试过增加它,因为即使这样做确实解决了这个问题,它将来也无法保护我们,而服务器的其他正常负载并不需要那么多。而且,我对使用JVM设置需要重启才能在生产环境中生效的做法感到犹豫不决。
这很难测试,因为导入过程运行正常,几乎没有任何明显的内存负载在我的本地开发机器和我们的QA盒子上,但是这两者与数据库的连接速度要慢得多,需要10-15分钟去完成。
我会很感激任何想法,特别是关于内存的去向。我无法弄清楚5MB数据如何变成700MB的数据。我们打开了调试信息,但调用脚本的IP地址不在调试列表中,我使用了一个cfsetting标签来关闭此页面的调试功能。以前,有一个步骤1.5将CSV数据转换为ColdFusion查询,但我为了提高效率而将其删除。两种方式都会导致错误。
感谢所有的回应。由于客户发生的月末和年终处理,以及他们昨天对CF服务器持续30秒的响应,我们将等待一周左右,然后尝试实施或测试任何这些建议。然后我会更新这个问题。 – Nicholas 2011-12-30 18:49:05