javascript - 是否可以创建一个使用 c 库进行 monetdb 连接的 node.js 模块?

标签 javascript node.js database monetdb node-ffi

我正在尝试将 monetdbnode.js 连接起来。我有一个简单的(20 行)c 程序,它可以使用 mapi 库查询 moentdb

我可以使用这些库为使用这些库并连接到 monetdbnode.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/

相关文章:

java - hibernate 多个连接动态变化

javascript - 为什么 Angular View 中的数组表达式不起作用?

Mysql Select with select result in another table

mysql - 使用密码和用户名锁定 mysql 数据库

node.js - 如何使用 Jade 在迭代中使用条件?

node.js - 如何在 gruntjs 任务中运行多个 shell 命令?

node.js - 带项目和过滤器的 Mongoose 查询

javascript - 为什么带有异步标记的较小尺寸的脚本会其次执行?

javascript - 指令模板必须只有一个根元素

javascript - Grails如何在没有资源插件的情况下处理静态文件?