Node.js在MySQL中存储数据 & 创建连接池
1.首先安装mysql客户端开发包
npm install mysql
然后引用mysql模块
var mysql = require('mysql');
2.建立连接&关闭连接
(1)createConnection方法创建连接对象(正式的说法是 使用createConnection方法创建一个表示与mysql数据库服务器之间连接的connection对象)
语法:var connection = mysql.createConnection(options); options为参数,是一个对象或者url字符串,用于指定该连接所用的各种选项。当为对象时一些属性有:host,port,user,password,database,multipleStatements,以上是常用的,还有一些不常用的,socketPath,charset,timezone,stringifyObjects,insecureAuth,typeCast,queryFormat,supportBigNumbers,bigNumbersStrings,debug
(2)用对象的connect方法建立连接。
语法:connection.connect(function(err) { *** }); function为建立连接操作结束后的回调函数,参数为连接失败时触发的错误对象。
(3)关闭连接,connection对象的end方法和destory方法。
语法:connection.end(function(err) { *** }); connection.destroy();
两种方法的区别:end方法可以使用一个参数,指定关闭操作结束时的回调函数。destory没有参数。end方法在关闭连接之前将所有查询操作执行完毕,destory直接关闭连接。
完整代码:
var mysql = require('mysql'); var connection = mysql.createConnection({ host : 'localhost', port : 3306, database : 'node', user : 'root', password : 'root' }); connection.connect(function(err) { if(err) { console.log("连接失败"); }else{ console.log("连接成功"); } }); connection.end(function(err) { if(err) { console.log("关闭连接失败"); }else{ console.log("关闭连接成功"); } });
3.执行数据处理
通过connection的query方法统一执行增删改查的操作。
语法:connection.query(sql,[parameters],[callback]); 其中sql为必须指定参数,为字符串,为需要执行的sql表达式。parameters为对象或者数组,存放sql参数所用到的所有参数的参数值。callback为执行操作结束后的回调函数。指定方法function(err,results){ *** } err为执行操作失败时触发的错误对象,results为一个对象,代表sql操作的执行结果。
在一个带有自增主键字段的数据表中插入一条数据后可在回调函数中使用result参数的insertId属性值获取该数据的主键值。
为了防止sql注入,可使用connection对象的escape方法对用户输入数据进行escape编码处理。connection.escape(data);
var query = 'select * from user where username = ' + connection.escape(data);
完整代码:
console.log(err); var mysql = require('mysql'); var connection = mysql.createConnection({ host : 'localhost', port : 3306, database : 'node', user : 'root', password : 'root' }); connection.connect(function(err) { if(err) { console.log("连接失败"); } else{ console.log("连接成功"); } }) var query = 'insert into user set ?'; connection.query(query,{ username : 'node', password : 'node', sex : 'woman' },function(err,results) { if(err) { console.log("插入失败"); } else{ console.log("插入成功"); console.log(results.insertId); connection.query('select * from user where username = "node"',function(err,results) { console.log("查询成功"); console.log(results); }) } })
4.创建连接池
在开发web应用程序时,连接池是一个很重要的概念。建立一个数据库连接所消耗的性能成本是很高的。在服务器应用程序中,如果为每一个接收到的客户端请求都建立一个或多个数据库连接,将严重降低应用程序性能。
因此在服务器应用程序中通常需要为多个数据库连接创建并维护一个连接池,当连接不再需要时,这些连接可以缓存在连接池中,当接收到下一个客户端请求时,从连接池中取出连接并重新利用,而不需要再重新建立连接。
语法:(1)创建连接池 createPool方法
var pool = mysql.createPool(optioins);options参数包含createConnection方法中可以使用的各种属性,除此之外还有以下属性:createConnection,waitForConnections,connectionLimit,queueLimit。
(2)从连接池中取出连接。getConnection方法。如无连接可用则隐式的建立一个数据库连接。
pool.getConnection(function(err,connection))。回调函数中的err为错误对象,connection为获取到的连接对象。
(3)当连接不再使用时,用connection对象的release方法将其归还到连接池中。connection.release();
(4)当一个连接不再需要使用且需要从连接池中移除时,用connection对象的destroy方法。connection.destroy(); 连接移除后,连接池中的连接数减一。
(5)当一个连接池不再需要使用时,用连接池对象的end方法关闭连接池。pool.end();
完整代码:
var mysql = require('mysql'); var pool = mysql.createPool({ host : 'localhost', port : 3306, database : 'node', user : 'root', password : 'root' }); pool.getConnection(function(err,connection) { if(err) { console.log("建立连接失败"); }else{ console.log("建立连接成功"); console.log(pool._allConnections.length);//1 connection.query('select * from user',function(err,rows) { if(err) { console.log("查询失败"); }else{ console.log(rows); } //connection.destroy(); console.log(pool._allConnections.length);//0 }); } pool.end(); })
这里还有一个问题,第二次查询连接池连接数的时候,并没有调用destroy方法,但是打印出连接数已经为0了。怀疑可能是query执行后自动断开连接,但觉得哪里还是有问题,以后继续求证。