2

ColdFusion 10、更新 8。Windows 2008 R2、IIS 7.5、Java 7、更新 17 で実行。Microsoft SQL Server 2005。キャッシュされたクエリの最大数: 1000

cffunction からのクエリは次のとおりです。

<cfquery name="local.qryDOTCensusPubSByCCStAlpha" datasource="#variables.dsn#" cachedwithin="#CreateTimeSpan(0, 1, 0, 0)#">
SELECT
    dot.CENSUS_NUM, dot.PHY_CITY, dot.[NAME]
FROM
    tblDOTCensusPub dot
WHERE
    dot.PHY_NATN = <cfqueryparam value="#arguments.PHY_NATN#" cfsqltype="CF_SQL_VARCHAR">
    AND dot.PHY_ST = <cfqueryparam value="#arguments.PHY_ST#" cfsqltype="CF_SQL_VARCHAR">
    AND dot.cUseForTD = 'Y'
    AND NOT EXISTS (SELECT * FROM tblDOTDisabled WHERE CENSUS_NUM = dot.CENSUS_NUM)
<cfif arguments.vcAStart EQ arguments.vcAEnd>
    AND LEFT(dot.[NAME], 1) = <cfqueryparam value="#arguments.vcAStart#" cfsqltype="CF_SQL_CHAR">
<cfelseif NOT (arguments.vcAStart EQ "0" AND arguments.vcAEnd EQ "Z")>
    AND LEFT(dot.[NAME], 1) >= <cfqueryparam value="#arguments.vcAStart#" cfsqltype="CF_SQL_CHAR">
    AND LEFT(dot.[NAME], 1) <= <cfqueryparam value="#arguments.vcAEnd#" cfsqltype="CF_SQL_CHAR">
</cfif>
ORDER BY
    dot.[NAME]
</cfquery>

このクエリは、ColdFusion 9.01 の cachedwithin 引数で機能していました。ColdFusion 10 では、キャッシュするかどうかはランダムです。ほとんどの場合、キャッシュされません。最初は、サブクエリの結果が異なる可能性があるため、「AND NOT EXISTS (SELECT * FROM tblDOTDisabled WHERE CENSUS_NUM = dot.CENSUS_NUM)」によってクエリがキャッシュから除外されるのではないかと考えました。ただし、その句を削除しても、クエリはキャッシュを拒否します。

使用しているサーバーが 2 つあります。生産と開発。

本番サーバーは、キャッシュからクエリをクリアするのに十分なヒットを取得する場合があります (ただし、そうではない可能性があります)。

開発サーバーにはほとんどヒットがないため、このクエリはキャッシュする必要があります。

このクエリが CF 10 にキャッシュされない理由について何か考えはありますか?

更新:
以下は、ColdFusion サーバーのデバッグ出力のスニペットです。

この質問のクエリ:

local.qryDOTCensusPubSByCCStAlpha (Datasource=tdDOTCensusPub, Time=62ms, Records=3962) in ~~~~hidden~~~~\cfc\DOTCensusPub.cfc @ 12:28:41.041

正常にキャッシュされている同じページの別のクエリ:

local.qryTop5JobPosters (Datasource=truckdriver, Time=16ms, Records=5, Cached Query) in ~~~~hidden~~~~\cfc\tdJobs.cfc @ 12:28:41.041

クエリがキャッシュされている場合、デバッグ出力には「Cached Query」が含まれることに注意してください。

また、パラメータが変更されていないことは確かです。これは、ページをリロードするために使用しているクエリ文字列です。

?PHY_NATN=US&PHY_ST=MN&vcAStart=M&vcAEnd=M&SR=1&MT=2

に渡される引数はすべてCFFunctionURL からのものです。ページをリロードするだけで、最初のページの読み込み後にクエリをキャッシュする必要があります。

アップデート:

本当に奇妙な行動に気付きました。開始文字と終了文字が同じ文字の場合に、「local.qryDOTCensusPubSByCCStAlpha」クエリ (問題も更新) を少し効率的にするように変更しました。ページを更新すると、デバッグ セクションに古いクエリが表示されました。更新されたクエリを表示するデバッグ セクションを取得するには、Ctrl-F5 キーを押す必要がありました。もう一度 Ctrl-F5 を押すと、クエリがキャッシュされたことが表示されました。だから私は今、CFがページ上で何も変更されていないことをブラウザに伝えていると考えています(デバッグセクションのクエリが変更されても)ブラウザは古いデバッグ出力を含むキャッシュされたページを表示します。デバッグ セクションが変更されているはずなのに、ページが「304 Not Modified」ステータスを返しているため、Firebug を使用するとこれが確認されるようです。

他の誰かがこれを確認できますか?cachedwithin 引数を使用してクエリを実行する CFC 関数を呼び出す単純な cfm テンプレートを作成し、ページをロードし (デバッグ情報を書き留めます)、cfc でクエリを変更し、ページをリロードするだけです。デバッグ セクションのクエリは、通常のページのリロードで変更されましたか? Ctrl-F5で変わりますか?

デバッグ情報を含むページで 304 ステータスを使用する必要はないと思います。タイミングやその他のデバッグ情報が古くなっていることがよくあります。

注: Ctrl-F5 を押すと、ブラウザーはページとすべてのページ オブジェクト (画像、JavaScript など) を強制的に再読み込みします。

4

2 に答える 2

0

私は実際にこの問題の反対を以前に経験しました。データベース構造をキャッシュし、構造が更新されたときに未定義のエラーをスローするプロジェクトがありました。私たちの問題はこれでした:

Select *
From tbl_data

キャッシュを防ぐための修正は次のとおりです。

Select t.*
From tbl_data AS t

これが問題の原因だと言っているのではありません。dot.Select *メソッドを使用しているため、機能しない可能性があると言っているだけです。dot.エイリアスを削除するか、次のSELECT *ようなものに更新してみてくださいSELECT t.*

この問題に関する詳細情報は次のとおりです。

http://www.bennadel.com/blog/194-ColdFusion-Query-Error-Value-Can-Not-Be-Converted-To-Requested-Type.htm

于 2013-03-24T00:41:41.313 に答える