以下を利用するのでインストールする。
https://github.com/felixge/node-mysql/#pooling-connections
# npm install --save mysql
--saveでpackage.jsonに追記するようにする。
【接続】
nodeJSはPHPとは違って起動時に接続を確保しておく。
接続には PoolCluster を利用する。
これはコネクションプールをグループ管理できる機能。
グループ管理はレプリケーション対応に使える。
以下のコードは接続先を確認するために
conf1, conf2 でDBを意図的に分けている。
---------app.js-----------
//mysql var mysql = require('mysql'); var conf1 = { host : 'localhost', user : 'root', password : 'pass', database : 'db1', connectTimeout : 10000, //タイムアウト(msec) supportBigNumbers : true, //bigint, decimal をサポートする。 connectionLimit : 10, //一度に生成する接続インスタンスの数 removeNodeErrorCount : 3 //指定した回数以上接続エラーになったら接続選択対象から削除する。 }; var conf2 = { host : 'localhost', user : 'root', password : 'pass', database : 'db2', connectTimeout : 10000, //タイムアウト(msec) supportBigNumbers : true, //bigint, decimal をサポートする。 connectionLimit : 10, //一度に生成する接続インスタンスの数 removeNodeErrorCount : 3 //指定した回数以上接続エラーになったら接続選択対象から削除する。 }; var pool = mysql.createPoolCluster(); pool.add('MASTER', conf1); pool.add('SLAVE1', conf1); pool.add('SLAVE2', conf2); app.set('pool', pool);
-----------------------------
routerは以下になる。
------------------
router.get('/', function(req, res, next) { var app = req.app; var poolCluster = app.get("pool"); //接続確認 var pool = poolCluster.of('SLAVE*', 'RANDOM'); pool.getConnection(function(err, connection) { console.log(connection.config.database); if(err != null){ //失敗 console.log('ERROR'); console.log(err); return; } console.log('connected'); //接続を解放する。接続はpoolに戻る。 connection.release(); }); res.send('db'); });
------------------
上記のrouterの poolCluster.of('SLAVE*', 'RANDOM') では SLAVE* というように * を使ってグループ指定している。
これはランダムにスレーブを選択してくれるだけではなく、接続できない場合には他のスレーブに再接続してくれる。
かなり便利。
注意点として、connection.release() は最後に実行するSQLで呼ぶこと。
最初のSQLとかリリースしてしまうと、
後のSQLで接続エラーが発生する。
【SELECT系クエリ】
プリペアードステートメントを利用。
--------------
var sql = 'SELECT * FROM tb1 WHERE id = ? OR id = ?'; connection.query(sql, [1, 2], function(err, rows) { console.log(rows); connection.release(); });
---------------
以下のようにquery()の戻り値のsqlを参照するとSQLが確認できるので便利。
------------
var query = connection.query(sql, [1, 2], function(err, rows) { }); console.log(query.sql);
------------
【INSERT系クエリ】
------------
var sql = 'INSERT INTO tb1 VALUES(?, ?)'; connection.query(sql, [10, 'ops'], function(err, result) { console.log(result); connection.release(); });
-------------