4

我们间歇性地但经常收到以下错误:

Error Executing Database Query. [Macromedia][SQLServer JDBC Driver][SQLServer]Could not find prepared statement with handle 1.

我实现了我能够找到的这个问题的两个解决方案 -

  1. 在查询末尾加上分号(据说是为了强制重新编译查询)
  2. 将此 MS-SQL 放在查询的末尾: OPTION (RECOMPILE)

我应用了修复 1,错误在那天的剩余时间里停止了。第二天,错误又回来了。

我应用了修复 2,同样的事情发生了——直到第二天才出现错误。

我确实明白,每当我使用<cfqueryparam>准备好的语句时,都会自动使用,但是是否有办法在每次使用查询时强制数据库“重新准备”而不依赖于缓存的语句?

请注意,我没有对此 Cf 服务器的管理员访问权限。

cf 版本是 9.0.0

SQL Server 9.0.3054。

有问题的查询:

<cfquery datasource="#dsn#" name="q" maxrows="1">
SELECT
ID
FROM
tableOne
WHERE ID = <cfqueryparam cfsqltype="cf_sql_integer" value="#url.ID#">
ORDER BY ID
</cfquery>

谢谢

4

3 回答 3

1

关于您的错误:当#dsn# 的值从一个请求更改为下一个请求时,我已经看到了该错误。如果不是这种情况,请尝试应用您的 CF 更新,因为您仍在 9.0.0 上。

关于您的问题:将“Max Pooled Statements”设置为0。这将要求CF每次重新准备语句。此外,取消选中“维护连接”也需要重新编译,因为每个请求都会重新协商与数据库的连接。

还有一个技术说明,无论您在 CF 中做什么,SQL Server 都会始终缓存执行计划。CF 只是保留该准备好的语句的句柄,因此它不必每次都通过网络传递 SQL。

于 2013-07-26T18:01:11.227 回答
1

您可以将 CachedWithin 属性设置为您的 cfquery 语句。

<cfquery 
    name="GetParks" datasource="#dsn#" name="q" maxrows="1" 
    cachedwithin="#CreateTimeSpan(0, 0, 0, 0)#">

上面的示例将始终将查询保留在缓存之外

于 2013-07-26T19:37:22.663 回答
0

这听起来可能很愚蠢,但您是否考虑过 maxrows 属性可能会导致您的痛苦。尝试使用 TOP 看看会发生什么。

<cfquery datasource="#dsn#" name="q">
SELECT TOP 1
ID
FROM
tableOne
WHERE ID = <cfqueryparam cfsqltype="cf_sql_integer" value="#url.ID#">
ORDER BY ID
</cfquery>
于 2013-07-29T18:20:04.043 回答