我正在尝试将 monetdb
与 node.js
连接起来。我有一个简单的(20 行)c 程序,它可以使用 mapi 库查询 moentdb
。
我可以使用这些库为使用这些库并连接到 monetdb
的 node.js
构建一些东西(模块/插件)吗?
(使用 odbc 是一种选择,但它有其自身的缺点。)
更新1:
node-ffi 非常棒。我能够很容易地创建一个获取表程序。 (例如,我已经添加了我的工作代码。)
所以如果我有3个选项
1.ODBC
2. Node -ffi
3. 一个获取数据库数据并通过套接字监听来自node.js的连接的c程序
就性能而言,如果我没有足够的时间为 node.js 开发插件,那么哪个是更好的实现选择
var ffi = require("ffi");
var libmylibrary = ffi.Library('/usr/local/lib/libmapi.so', {
"mapi_connect":["int",["string",'int',"string","string","string","string"]],
"mapi_query":['int',["int","string"]],
"mapi_fetch_row":["int",["int"]],
"mapi_fetch_field":["string",["int","int"]]
});
var res = libmylibrary.mapi_connect("localhost", 50000,"monetdb", "monetdb", "sql", "demo");
console.log(res);
var ret=libmylibrary.mapi_query(res,"select * from table");
while(libmylibrary.mapi_fetch_row(ret)){
console.log(libmylibrary.mapi_fetch_field(ret,0));
console.log(libmylibrary.mapi_fetch_field(ret,1));
}
更新 2:
不建议将以上代码用于生产...它不使用 node.js 的异步功能,因此请将其用于婴儿步骤
最佳答案
虽然 FFI 使调用 native 代码变得容易,但您真的不应该将它用于您必须经常做的事情,例如调用数据库库。来自文档:
There is non-trivial overhead associated with FFI calls. Comparing a hard-coded binding version of strtoul() to an FFI version of strtoul() shows that the native hard-coded binding is orders of magnitude faster. So don't just use the C version of a function just because it's faster. There's a significant cost in FFI calls, so make them worth it.
换句话说,FFI 有效,但慢。如果您只需要调用几个电话,这很好,但如果您需要频繁调用电话,这就非常糟糕了。
你需要做的是写一个 addon .插件是为 C 和 C++ 库提供粘合的 C++ 模块。 (仅仅因为你必须用 C++ 编写插件并不意味着你不能从插件中调用纯 C 代码!)
Node docs提供大量可以帮助您入门的示例。如果您使用的是 Windows,here's some tips设置 VS。
如果对 C 库的调用是阻塞的,您需要将它们设为异步。 libuv provides a thread pool you can do the work on.
关于javascript - 是否可以创建一个使用 c 库进行 monetdb 连接的 node.js 模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15574886/