我正在使用node.js driver进行SqlAnywhere。
我正在准备"资源调控器以准备语句'超出" 错误。
最初,我正在执行我的查询:
connection.exec(myQuery, myArgs, myCallback);
myQuery
看起来像这样:
"SELECT * FROM some_procedure(?, ?, ?);"
然后我将其改为:
connection.exec(myQuery, myCallback);
myQuery现在看起来像这样:
"SELECT * FROM some_procedure(%s);"
然后使用util.format
格式化查询:
myQuery = util.format(query, args.join(','));
...但我仍然得到同样的错误。为什么会这样?
如何阻止连接创建一堆预准备语句?
谢谢!
编辑:我知道连接的预设语句限制为50(默认值)。
答案 0 :(得分:2)
我认为 sqlanywhere api中存在错误。 我检查了他们的代码,当你将回调传递给查询
时,似乎他们不会删除该语句if( callback_required ) {
Local<Function> callback = Local<Function>::Cast(args[cbfunc_arg]);
baton->callback = Persistent<Function>::New( callback );
int status;
status = uv_queue_work( uv_default_loop(), req, executeWork, (uv_after_work_cb)executeAfter );
assert(status == 0);
return scope.Close( Undefined() );
}
只有在此回调后才执行stmt drop代码
if( baton->sqlany_stmt != NULL ) {
api.sqlany_free_stmt( baton->sqlany_stmt );
}
无论如何,作为解决方法,我建议您为每个查询创建statement
,然后在执行后drop
创建。
在github中报告此错误也很有趣。