5

と接続しようとしmonetdbていnode.jsます。moentdbmapi ライブラリを使用してクエリを実行できる単純な (20 行の) C プログラムがあります。

node.jsこれらのライブラリを使用して、これらのライブラリを使用して接続する何か(モジュール/アドオン)を構築できますmonetdbか?

(odbc の使用はオプションですが、独自の欠点があります。)

Update1 :
node-ffi はかなり素晴らしいです。フェッチ テーブル プログラムを非常に簡単に作成できました。(たとえば、作業コードを追加しました。)

したがって、3 つのオプションがある場合
1. ODBC
2. node-ffi
3. データベース データを取得し、ソケットを介して node.js からの接続をリッスンする ac プログラム

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 の非同期機能を使用しないため、ベイビー ステップで使用してください。

4

1 に答える 1

4

FFI を使用するとネイティブ コードを簡単に呼び出すことができますが、データベース ライブラリの呼び出しなど、頻繁に実行する必要があるものには FFI を使用しないでください。ドキュメントから:

FFI 呼び出しに関連する重要なオーバーヘッドがあります。strtoul() のハードコーディングされたバインディング バージョンと strtoul() の FFI バージョンを比較すると、ネイティブのハードコーディングされたバインディングが桁違いに高速であることがわかります。したがって、関数の C バージョンの方が速いという理由だけで使用しないでください。FFI コールにはかなりのコストがかかるため、それだけの価値があるものにしてください。

つまり、FFI は機能しますが、遅いです。数回の電話をかける必要がある場合はこれで問題ありませんが、頻繁に電話をかける必要がある場合は非常に悪いニュースです.

あなたがする必要があるのはaddonを書くことです。アドオンは、C および C++ ライブラリに接着剤を提供する C++ モジュールです。(アドオンを C++ で書かなければならないからといって、アドオンから純粋な C コードを呼び出せないわけではありません!)

ノードのドキュメントには、開始するための多くの例が用意されています。Windows を使用している場合は、VS をセットアップするためのヒントをいくつか紹介します。

C ライブラリへの呼び出しがブロックされている場合は、それらを非同期にする必要があります。 libuv は、作業を行うことができるスレッド プールを提供します。

于 2013-04-03T14:38:22.580 に答える