2013-06-13 2 views
0

Я пытаюсь кэшировать хранимую процедуру. Я загружаю ColdFusion 10, и он работает на сервере Railo 4. У меня есть настройка подключения к базе данных в моем администраторе Railo (кеш по умолчанию), и в соответствии с документами Adobe мне нужно только использовать атрибут cachedWithin, и он должен быть кэширован. Тем не менее, это не так, и я знаю это точно, потому что мои страницы занимают более 10 секунд. загружать!Кэширование хранимой процедуры в ColdFusion

Я попытался динамически кэшировать его с помощью тегов cfcache вокруг хранимых процедур, но это продолжало кэшировать всю страницу, которую я не хочу кэшировать. CachePut и CacheGet также работают, но мой код - это сложный способ для их эффективного размещения.

Super confused.

Вот соответствующий код:

<cfstoredproc datasource="#XXX#" procedure="XXX" cachedWithin="#CreateTimeSpan(0,3,0,0)#"> 
       <cfprocparam type="In" value="#IDate#" cfsqltype="CF_SQL_TIMESTAMP"> 
       <cfprocparam type="In" value="12" cfsqltype="CF_SQL_INTEGER"> 
       <cfprocparam type="In" value="1" cfsqltype="CF_SQL_BIT"> 
       <cfprocresult name="DeptQuery"> 
</cfstoredproc> 

UPDATE: Оказывается, что хранимая процедура не один принимает все это время! И у меня есть кэш наконец! Но я смущен тем, как это происходит, поскольку я кэширую 1000 вариантов одной и той же хранимой процедуры на нескольких страницах (причем каждая страница имеет несколько хранимых процедур), и все, что я указал, является параметром cachedWithin. Как он узнает, какая процедура является, когда она подтягивает их к виду?

+1

_my страницы занимают более 10 секунд. toload_ - Вы уверены, что это запрос хранимой процедуры, который занимает все это время, или это обработка результатов запроса занимает время? Включите отладку и посмотрите на выход. Это не только покажет вам, если запрос (ы) кэшируется или нет, но также покажет вам, где ColdFusion тратит время обработки. Вы используете тег 'cfstoredproc' или тег' cfquery'? Это помогло бы, если бы вы показали нам какой-либо соответствующий код. –

+0

Кроме того, поместите тег cfabort после вызова вашего SP. Поскольку все, что вас интересует, это время выполнения, тег abort получит это быстрее. –

+0

Я использовал тег cfdump, но он не детализирует кеширование. –

ответ

1

Вы проходите (как выглядит) дату/время. Кэширование запросов основано на аргументах запроса (или, более конкретно, на SQL, который будет использоваться). Я предполагаю, что вы каждый раз проходите по разному времени/времени. У каждого другого значения даты/времени будет свой собственный кешированный результат, если только вы просто не переходите к одному и тому же значению даты каждый раз?

например. они будут рассматриваться как два различных объектов для кэширования:

<cfstoredproc datasource="#XXX#" procedure="XXX" cachedWithin="#CreateTimeSpan(0,3,0,0)#"> 
    <cfprocparam type="In" value="2013-06-13 09:00:00" cfsqltype="CF_SQL_TIMESTAMP"> 
</cfstoredproc> 

<cfstoredproc datasource="#XXX#" procedure="XXX" cachedWithin="#CreateTimeSpan(0,3,0,0)#"> 
    <cfprocparam type="In" value="2013-06-13 10:00:00" cfsqltype="CF_SQL_TIMESTAMP"> 
</cfstoredproc>  

От documentation:

Чтобы использовать кэшированные данные, текущий запрос должен использовать же оператор SQL, источник данных, имя запроса, имя пользователя и пароль.

+0

. То же самое время можно отправить несколько раз, но у меня также есть параметр строки, который я отправляю в том, что я пропустил из примера. Это то, как он знает, какой кешированный запрос есть? –

+0

да, так что даже если ваша дата всегда идентична, если каждый параметр строки различен, каждый из них будет рассматриваться как отдельный SQL-запрос для кэширования. – duncan

+0

Это не идеальное решение, но вы можете запустить свою хранимую процедуру без строки и вытащить все обратно, а затем использовать Query of Queries, чтобы вывести конкретные результаты. Это нехорошее решение, но поможет. –