SqlAnywhere的Node.js驱动程序 - 超出了Prepared语句

时间:2014-07-15 14:19:53

标签: node.js prepared-statement sqlanywhere

我正在使用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(默认值)。

1 个答案:

答案 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中报告此错误也很有趣。