【Node.js】MySQLへの接続

MySQL


以下を利用するのでインストールする。
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();
});

-------------