Эрик, вы абсолютно правы в отношении того, что сборщик мусора в ColdFusion не удаляет информацию о запросах из памяти до завершения запроса, и Я довольно подробно задокументировал ее в другом вопросе SO . Короче говоря, вы нажимаете OoM Exception, когда зацикливаетесь на запросах. Вы можете доказать это с помощью такого инструмента, как VisualVM , чтобы создать дамп кучи во время выполнения процесса, а затем запустить полученный дамп с помощью Eclipse Memory Analyzer Tool (MAT). Что бы MAT показало вам, это большая иерархия, начинающаяся с объекта с именем (я не придумываю это) CFDummyContent
, который содержит, помимо прочего, ссылки на теги cfquery
и cfqueryparam
. Обратите внимание, что попытка изменить его до сохраненных процедур или даже взаимодействие с базой данных через JDBC не имеет значения.
Так. Какие. Для. У
Мне потребовалось некоторое время, чтобы понять, но у вас есть 3 варианта в возрастающем порядке сложности:
<cthread/>
- асинхронный шлюз CFML
- http-запросы в гирляндной цепочке
Использование cfthread выглядит так:
<cfloop ...>
<cfset threadName = "thread" & createUuid()>
<cfthread name="#threadName#" input="#value#">
<!--- do query stuff --->
<!--- code has access to passed attributes (e.g. #attributes.input#) --->
<cfset thread.passOutOfThread = somethingGeneratedInTheThread>
</cfthread>
<cfthread action="join" name="#threadName#">
<cfset passedOutOfThread = cfthread["#threadName#"].passOutOfThread>
</cfloop>
Обратите внимание, что этот код не , использующий преимущества асинхронной обработки, то есть немедленного соединения после каждого вызова потока, а скорее побочный эффект, который выполняет cfthread в своей собственной области запроса, независимо от страницы.
Я не буду здесь описывать шлюзы ColdFusion. Последовательность HTTP-цепочек означает выполнение инкремента и в конце инкремента запуск запроса к тому же алгоритму с указанием выполнить следующий инкремент.
По сути, все три подхода позволяют собирать эти ссылки на память в середине процесса.
И да, для тех, кто спрашивает, ошибки были выявлены в Adobe, см. Вопрос, на который ссылаются. Кроме того, я считаю, что эта проблема является специфической для Adobe ColdFusion, но я не тестировал Railo или OpenDB.
Наконец-то надо разглагольствовать. Я потратил много времени на то, чтобы отследить это, исправить его в своей собственной большой базе кода, и несколько других, перечисленных в упомянутом вопросе, тоже. AFAIK Adobe не признает проблему, тем не менее стремится решить ее. И да, это ошибка, простая и понятная.