node.jsプロジェクトでMySQLレプリカを読み書きするためのDBクエリを実装する適切な方法は?

アンナ・トロチコ

MySQL5.6データベースとmysqlクライアントを使用して接続するnode.jsExpressプロジェクトがあります。プロジェクトにはORMがなく、生のクエリがDBに対して実行されます。ここで、SELECT(トランザクション内にない)クエリがMySQL読み取りレプリカにルーティングされるようにコードを変更する必要があります。私はこれまで他のプロジェクトで同様のことをしたことがないので、(node.jsで)それを行うためのベストプラクティスは何であるか疑問に思いました。

私がいることを発見したsequelizeライブラリは読み取りおよび書き込みが個別にレプリカし、別のクエリが異なるデータベースにルーティングされるだろうが、私はそれをやってのいずれかのオプション発見していない指定することを可能にする設定オプションがあるmysqlクライアントライブラリを。を使用してみましたsequelizeが、RAWクエリではこの機能がサポートされていないようです。

それとは別に、アーキテクチャの観点から最善の解決策は何でしょうか?現在、私が見ている唯一のオプションは、queryメソッドを持つデータベースラッパーサービスmysql connection.queryを使用することです。これ、をカプセル化し、提供されたSQLに基づいて、使用するデータベース接続を決定します(読み取りまたは書き込み(トランザクションでない場合))。すべて同じDBで実行する必要があると思います)。これはかなり馬鹿げた解決策ですが、今のところ私の唯一のアイデアです。

誰かがこれに関するいくつかの経験を共有できますか?node.jsプロジェクトだけでなく、アーキテクチャのアイデアも歓迎します。おそらく、ホストに到達する前にリクエストをプロキシする方法はありますか?よろしくお願いします。

アンナ・トロチコ

したがって、最終的には、かなり簡単な方法で解決しました。読み取りと書き込みのDBレプリカ用に個別の接続プールを作成し、必要な場所でそれぞれを直接使用しました。

const writePool = mysql.createPool(writeConnectionString);
const readPool = mysql.createPool(readConnectionString);

function getWriteConnection() {
    return writePool.getConnection();
};

async function getReadConnection() {
    const connection = await readPool.getConnection();
    connection.isRead = true;
    const originalQuery = connection.query;
    connection.query = function (...args) {
        if(!isSelectQuery(args[0])) {
            throw new Error('Read connection cannot be used for the commands other than SELECT.');
        }

        return originalQuery.apply(this, args);
    };

    return connection;
};

// checking if query is SELECT
function isSelectQuery(query) {
    return query.replace(/\s+/mi, '').toLowerCase().startsWith('select');
}

// release function
function release(connection) {
    if(connection.isRead) {
        readPool.releaseConnection(connection)
    } else {
        writePool.releaseConnection(connection);
    }
};

次にコードで:

const connection = await database.getReadConnection();
await connection.query('SELECT * FROM ...');
....
database.release(connection);

これはそれを解決するための最も洗練された方法ではありませんが、最小限の変更とその後のバグで私の問題を比較的迅速に解決しました。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

MySQLをNode.jsに接続するための単純なプロジェクトからのエラー

分類Dev

node.jsでリクエスト後のペイロードを読み取って表現する方法は?

分類Dev

node.jsでAngularプロジェクトを実行する

分類Dev

Node.js相対には、スクリプトを実行するためのパスが必要です

分類Dev

Expressを使用してMongoDBサーバーにクエリを実行する(Node.jsプロジェクト)

分類Dev

Node.JSツールを備えたVisualStudio 2017がnode.jsプロジェクトを実行/デバッグできないのはなぜですか?

分類Dev

node.jsでインタラクティブスクリプトを開始するために.loadを評価できないのはなぜですか?

分類Dev

コールバックを実装しようとしています。または、getリクエストが完了するまで待つ方法です。これはnode.jsエクスプレスにあります

分類Dev

node.jsでリクエストオブジェクトのプロトコルを取得するにはどうすればよいですか?

分類Dev

自分のnode.jsスクリプトをAngular4プロジェクトに追加する方法

分類Dev

Node.jsスクリプトをフロントエンドプロジェクトに接続する

分類Dev

node.jsプロジェクトでvscodeインテリセンスにローカルで.d.tsタイピングを使用する方法は?

分類Dev

ClojureScriptプロジェクトのNode.jsライブラリを使用する

分類Dev

無効なcspポリシーを取得する-CentOSにnode.jsアプリケーションをデプロイする場合は、配列、文字列、またはプレーンオブジェクトである必要があります

分類Dev

POSTリクエストを実行するときに、node.jsバージョンのXMLHttpRequestでリクエストボディを適切に送信できない

分類Dev

JavaScriptオブジェクト/配列をフロントエンドに送信する方法-node.jsアプリ

分類Dev

複数のプロジェクト間でnode_modulesディレクトリを共有する

分類Dev

複数のプロジェクト間でnode_modulesディレクトリを共有する

分類Dev

node.jsで独自のスクリプトを作成する方法

分類Dev

node.jsリクエストオブジェクト-さらなる操作のためにレスポンスボディを返します

分類Dev

pm2の使用時にNode.jsプロジェクトを自動的にリロードする方法

分類Dev

1ページのWebアプリでnode.jsで「投稿」リクエストを処理する方法

分類Dev

Node.jsでhttpリクエストを適切にキャンセルする方法は?

分類Dev

Sails Express Node jsで、リクエストされたページの読み込み中に広告を表示する方法

分類Dev

node.jsでプライベートgitリポジトリのクローンを作成する方法

分類Dev

node.jsの非同期および条件付きループ内でネストされたクエリを実行する方法

分類Dev

node.jsスクリプト内でwineを介して実行するために呼び出されたプログラムがフリーズする

分類Dev

問題のプルリクエストを提供するための効率的なnode.jsコア(C ++ / JS)ワークフロー?

分類Dev

Angular-CLIプロジェクトでnode_moduleの不正な入力を上書きするにはどうすればよいですか?

Related 関連記事

  1. 1

    MySQLをNode.jsに接続するための単純なプロジェクトからのエラー

  2. 2

    node.jsでリクエスト後のペイロードを読み取って表現する方法は?

  3. 3

    node.jsでAngularプロジェクトを実行する

  4. 4

    Node.js相対には、スクリプトを実行するためのパスが必要です

  5. 5

    Expressを使用してMongoDBサーバーにクエリを実行する(Node.jsプロジェクト)

  6. 6

    Node.JSツールを備えたVisualStudio 2017がnode.jsプロジェクトを実行/デバッグできないのはなぜですか?

  7. 7

    node.jsでインタラクティブスクリプトを開始するために.loadを評価できないのはなぜですか?

  8. 8

    コールバックを実装しようとしています。または、getリクエストが完了するまで待つ方法です。これはnode.jsエクスプレスにあります

  9. 9

    node.jsでリクエストオブジェクトのプロトコルを取得するにはどうすればよいですか?

  10. 10

    自分のnode.jsスクリプトをAngular4プロジェクトに追加する方法

  11. 11

    Node.jsスクリプトをフロントエンドプロジェクトに接続する

  12. 12

    node.jsプロジェクトでvscodeインテリセンスにローカルで.d.tsタイピングを使用する方法は?

  13. 13

    ClojureScriptプロジェクトのNode.jsライブラリを使用する

  14. 14

    無効なcspポリシーを取得する-CentOSにnode.jsアプリケーションをデプロイする場合は、配列、文字列、またはプレーンオブジェクトである必要があります

  15. 15

    POSTリクエストを実行するときに、node.jsバージョンのXMLHttpRequestでリクエストボディを適切に送信できない

  16. 16

    JavaScriptオブジェクト/配列をフロントエンドに送信する方法-node.jsアプリ

  17. 17

    複数のプロジェクト間でnode_modulesディレクトリを共有する

  18. 18

    複数のプロジェクト間でnode_modulesディレクトリを共有する

  19. 19

    node.jsで独自のスクリプトを作成する方法

  20. 20

    node.jsリクエストオブジェクト-さらなる操作のためにレスポンスボディを返します

  21. 21

    pm2の使用時にNode.jsプロジェクトを自動的にリロードする方法

  22. 22

    1ページのWebアプリでnode.jsで「投稿」リクエストを処理する方法

  23. 23

    Node.jsでhttpリクエストを適切にキャンセルする方法は?

  24. 24

    Sails Express Node jsで、リクエストされたページの読み込み中に広告を表示する方法

  25. 25

    node.jsでプライベートgitリポジトリのクローンを作成する方法

  26. 26

    node.jsの非同期および条件付きループ内でネストされたクエリを実行する方法

  27. 27

    node.jsスクリプト内でwineを介して実行するために呼び出されたプログラムがフリーズする

  28. 28

    問題のプルリクエストを提供するための効率的なnode.jsコア(C ++ / JS)ワークフロー?

  29. 29

    Angular-CLIプロジェクトでnode_moduleの不正な入力を上書きするにはどうすればよいですか?

ホットタグ

アーカイブ