SqlAnywhere的Node.js驱动程序 – 超出了准备语句
我正在使用SqlAnywhere的node.js 驱动程序 。
我得到“资源调控器”准备好的报表“超出”错误。
最初,我正在执行这样的查询:
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(','));
…但我仍然得到相同的错误。 为什么发生这种情况?
如何防止连接创build一堆准备好的语句?
谢谢!
编辑:我知道有一个连接的50(默认值)准备语句的限制。
我认为在sqlanywhere API有一个错误。 我检查了他们的代码,似乎他们不会删除语句时传递给查询callback
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() ); }
只有在这个callback之后,stmt drop代码才会被执行
if( baton->sqlany_stmt != NULL ) { api.sqlany_free_stmt( baton->sqlany_stmt ); }
无论如何,我build议你为每个查询创build一个statement
,然后在执行后drop
它。
在他们的github上报告这个bug也会很有趣。