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也会很有趣。