Ошибка тайм-аута ColdFusion - PullRequest
3 голосов
/ 05 мая 2010

У меня есть запланированное задание, которое запускается один раз в день и создает файл XML, который я передаю другой группе. В последнее время объем данных значительно увеличился и теперь вызывает задержку выполнения задачи (я думаю). Я пытался максимально оптимизировать свой сценарий, но безуспешно. Время истекает задолго до часа, и я не получаю никакой ошибки ColdFusion. Вместо этого я получаю «Эта страница не может быть найдена» после ее запуска.

  • Может ли это быть тайм-аут в другом месте, кроме Coldfusion?
  • Есть ли более эффективный способ создания этого XML-файла?

файл:

<cfsetting requesttimeout="7200">
<cftry>
    <cfquery datasource="datasource" name="getPeople">
        select PersonID, FirstName, LastName
        from People
    </cfquery>
    <cfquery datasource="datasource" name="getDepartments">
        select d.DepartmentID, DepartmentName, pd.PersonID
        from Department d inner join PersonDepartment pd on d.DepartmentID = pd.DepartmentID
    </cfquery>
    <cfquery datasource="datasource" name="getPapers">
        select PaperID, PaperTitle, PaperDescription, pp.PersonID
        from Paper p inner join PersonPaper pp on p.PaperID = pp.PaperID
    </cfquery>
<cfsavecontent variable="theXML"><?xml version="1.0" encoding="utf-8" ?><people>
<cfoutput query="getPeople"><cfsilent>
        <cfquery dbtype="query" name="getPersonDepartments">
        select DepartmentID, DepartmentName
        from getDepartments
        where PersonID = #getPeople.PersonID#
        </cfquery>
        <cfquery dbtype="query" name="getPersonPapers">
        select PaperID, PaperDescription
        from getpapers
        where PersonID = #getPeople.PersonID#
        </cfquery>
        </cfsilent> <person>
        <person_id>
            #getPeople.PersonID#
        </faculty_id>
        <person_first_name>
            #getPeople.Firstname#
        </person_first_name>
        <person_last_name>
            #getPeople.LastName#
        </person_last_name><cfif getPersonDepartments.recordcount gt 0>
        <departments><cfloop query="getPersonDepartments">
            <department>
                <department_id>
                    #getPersonDepartments.DepartmentID#
                </department_id>
                <department_name>
                    #getPersonDepartments.DepartmentName#
                </department_name>
            </department></cfloop>
        </departments></cfif><cfif getPersonPapers.recordcount gt 0>
        <papers><cfloop query="getPersonPapers">
            <paper>
                <paper_id>
                    #getPersonPapers.PaperID#
                </paper_id>
                <paper_description>
                    #getPersonPapers.PaperDescription#
                </paper_description>
            </paper></cfloop>
        </papers></cfif>
    </person>
</cfoutput></faculty>
</cfsavecontent>
<!--- Generate the file that contains the RSS --->
<cffile action="write" file="#application.serverroot#/People.xml" output="#theXml#" nameconflict="overwrite">
<cfcatch>
<cfdump var="#cfcatch#">
</cfcatch>
</cftry>
Done!

Ответы [ 2 ]

3 голосов
/ 05 мая 2010

Для меня это звучит как проблема с памятью. Может случиться, что ваша страница заполняет все пространство кучи, предназначенное для Coldfusion, а затем «живет» в паре мегабайт, которые очищаются сборщиком мусора до истечения времени. Я работал с файлами размером 1ГБ + XML, поэтому у меня был настоящий кошмар, пока я все не разобрался.

Так что вы можете сделать?

  1. Убедитесь, что отладка выключена.

  2. Проверьте журналы

  3. Откройте CF Monitor Tool и посмотрите, что произойдет, когда вы запустите это. (Если вы не видите монитор, используйте диспетчер задач и посмотрите, занимает ли jrun такой же объем памяти, как в cfadmin)

  4. Вы также можете сделать приблизительную оценку размера вашего xml, например, количество строк по среднему количеству символов в этом узле XML. А если он слишком большой, это может помочь вам разобраться.

Оформить список инструментов Чарли Арехарта, которые могут помочь вам с этим и другими проблемами http://www.carehart.org/cf411/

Существуют и другие способы создания XML, которые могут сэкономить память и / или время обработки. Но давайте сначала выясним, в чем проблема.

1 голос
/ 05 мая 2010

запустите это (пока выполняется запланированное задание), чтобы увидеть, блокирует ли что-либо:

SELECT
    r.session_id AS spid
        ,r.cpu_time,r.reads,r.writes,r.logical_reads 
        ,r.blocking_session_id AS BlockingSPID
        ,LEFT(OBJECT_NAME(st.objectid, st.dbid),50) AS ShortObjectName
        ,LEFT(DB_NAME(r.database_id),50) AS DatabaseName
        ,s.program_name
        ,s.login_name
        ,OBJECT_NAME(st.objectid, st.dbid) AS ObjectName
        ,SUBSTRING(st.text, (r.statement_start_offset/2)+1,( (CASE r.statement_end_offset
                                                                  WHEN -1 THEN DATALENGTH(st.text)
                                                                  ELSE r.statement_end_offset
                                                              END - r.statement_start_offset
                                                             )/2
                                                           ) + 1
                  ) AS SQLText
    FROM sys.dm_exec_requests                          r
        JOIN sys.dm_exec_sessions                      s ON r.session_id = s.session_id
        CROSS APPLY sys.dm_exec_sql_text (sql_handle) st
    WHERE r.session_id!=@@SPID
...