我们间歇性地收到以下错误,但通常是:
Error Executing Database Query. [Macromedia][SQLServer JDBC Driver][SQLServer]Could not find prepared statement with handle 1.
我实现了我能够找到的这个问题的两个解决方案 -
OPTION (RECOMPILE)
我已应用修复1,错误在当天的剩余时间内停止。第二天错误又回来了。
我应用了修复2并且发生了同样的事情 - 直到第二天再没有错误。
我确实理解每当我使用<cfqueryparam>
时,会自动使用预准备语句,但是每次使用查询时都没有办法强制db“重新准备”而不依赖于缓存的语句?
请注意,我没有此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>
由于
答案 0 :(得分:1)
关于您的错误:在#dsn#的值从一个请求更改为下一个请求之前,我已经看到了该错误。 如果不是这种情况,请尝试应用您的CF更新,因为您仍然使用9.0.0。
关于您的问题:Set&#34; Max Pooled Statements&#34;这将要求CF每次重新准备声明。此外,取消选中&#34;维护连接&#34;还需要重新编译,因为每次请求都会重新协商与DB的连接。
同样是技术说明,无论您在CF中执行什么操作,SQL Server都将始终缓存执行计划。 CF只是持有该预处理语句的句柄,因此它不必每次都通过网络传递SQL。
答案 1 :(得分:1)
您可以将CachedWithin属性设置为cfquery语句..
<cfquery
name="GetParks" datasource="#dsn#" name="q" maxrows="1"
cachedwithin="#CreateTimeSpan(0, 0, 0, 0)#">
以上示例将始终将查询保留在缓存之外
答案 2 :(得分: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>