7.8 Node.js兼容框架
Limax集成原生java版本node.js兼容框架,使用JDK8提供的Nashorn引擎,依据node.js手册的描述实现,并做了适当扩展,以利于集成到Limax框架中,为连接Limax外的系统提供便利。
Nashorn支持ES5.1标准,对于某些ES6标准的js文件,应该首先使用6to5工具转换,现有Node.js手册示例都是ES6代码,应该转换以后实验。
以下的描述,符合node.js 6文档的顺序,便于对比。
-
7.8.2 增强模块
长期以来,node.js被诟病最多问题的就是缺乏持久化能力与管理能力。Java能够轻松解决这些问题,所以扩充两个模块sql和edb,分别提供关系数据库,键值对数据库访问能力,扩充一个简单JMX查询模块monitor。
-
Sql
-
sql.Connection类
‘close’ 事件
connection.execute(statement [,parameter1[,parameter2…]], callback)
connection.destroy()
sql.createConnection(url)
Sql.Connection类
提供数据库连接,内部实现为连接池,不活动的连接1分钟淡出。
var url = 'jdbc:mysql://192.168.1.3:3306/test?user=root&password=admin&autoReconnect=true' var sql = require("sql"); var conn = sql.createConnection(url); conn.once('close', function() { console.log('closed') }); conn.execute("select * from a where id > ?", 1, function(err) { if (err) { console.log(err); return; } var s = '!'; for (var i = 1; i < arguments.length; i++) s += arguments[i] + ' '; console.log(s) }); conn.destroy();
‘close’ 事件
执行destroy,关闭数据库连接,但是关闭时可能还有活动连接存在,所有的活动连接结束以后触发该事件,表示数据库连接彻底关闭。
connection.execute(statement [,parameter1[,parameter2…]], callback)
statement <String> 符合jdbc规范的sql语句,用?占位
parameter <Object> 该参数的个数必须和statement中的占位符个数相等
callback <Function> 结果回调
parameter通过PreparedStatement.setObject()方法设置到查询请求中,能接受的类型取决于应用数据库的JDBC连接库,一般来说int类型string类型没有问题,其它类型必须通过实际测试决定,小心long,js的long只有53位有效位。最坏情况下,可以重新设计sql语句,支持string参数,使用数据库自身的convert函数将string转换为目标类型。
callback第一个参数是err,这一点与node.js习惯一致。SELECT使用的callback参数数量取决于查询语句本身返回的列数,查询语句返回N列,那么使用N+1个参数进行回调。查询语句可能返回空集,所以为了表示查询结束,最后一次callback传入0个参数,可以通过arguments.length = 0检测查询结束,所以上面的例子,最后一行输出总是单字符”!”。返回结果的类型思考与paramter一致,如果返回了不可识别的类型,考虑修改sql语句使用数据库自身的convert转换为string。UPDATE,DELETE,INSERT,这一类操作用2个参数调用callback一次,第二个参数为影响的行数。
connection.destroy()
结束数据库连接,destroy之后的execute调用直接用连接已经关闭的错误回调。
sql.createConnection(url)
url <String> 数据库连接url
创建数据库连接的便捷方法。
-
-
Edb
-
edb.Instance类
‘close’ 事件
instance.addTable(table1, [,table2 [,table3 …]], callback)
instance.removeTable(table1, [,table2 [,table3 …]], callback)
instance.insert(table, key, value, callback)
instance.replace(table, key, value, callback)
instance.remove(table, key, callback)
instance.find(table, key, callback)
instance.exist(table, key, callback)
instance.walk(table, [,from], callback)
instance.destroy()
edb.createEdb(path)
edb.Instance类
edb对象实例,提供键值对数据库访问操作。
首先,必须创建目录’/work/js.test/dbhome’,Edb不会自动创建。
var edb = require('edb').createEdb('/work/js.test/dbhome'); edb.once('close', function() { console.log('close')}); edb.addTable('a', function() { var n = 3; function insert3() { if (--n > 0) return; edb.find('a', '1', console.log); edb.walk('a', '0', console.log); edb.destroy(); } edb.insert('a', '0', 'AA', insert3); edb.insert('a', '1', 'b', insert3); edb.insert('a', '3','',insert3); });
注意一下这段代码的并行特性,3个insert操作并行,完成以后find与walk操作并行,之后destroy关闭数据库,禁止后续查询操作。
‘close’ 事件
执行destroy,关闭Edb实例,但是关闭时可能还有操作正在执行,所有的操作执行结束以后触发该事件,表示Edb实例彻底关闭。
instance.addTable(name1, [,name2 [,name3 …]] , callback)
name <String> 往数据库中添加的表名
callback <Function>
一次可以添加多个表,执行完成callback被调用,如果有错误第一个参数为Exception信息。数据库中已有该表,操作忽略。
instance.removeTable(name1, [,name2 [,name3 …]] , callback)
name <String> 从数据库中删除的表名
callback <Function>
一次可以删除多个表,执行完成callback被调用,如果有错误第一个参数为Exception信息。数据库中该表不存在,操作忽略。
instance.insert(table, key, value, callback)
table <String> 表名
key <Buffer|String>
value <Buffer|String>
callback <Function>
插入一个键值对,key或者value如果为String,在内部用utf8编码为Buffer后执行。
callback(err, succeed);如果key在表中已经存在succeed == false,插入失败。
instance.replace(table, key, value, callback)
table <String> 表名
key <Buffer|String>
value <Buffer|String>
callback <Function>
替换一个键值对,key或者value如果为String,在内部用utf8编码为Buffer后执行。
callback(err)。key在表中不存在执行插入,存在则替换。
instance.remove(table, key, callback)
table <String> 表名
key <Buffer|String>
callback <Function>
删除一个键值对,key如果为String,在内部用utf8编码为Buffer后执行。
callback(err)。key在表中不存在,操作忽略,不作为错误。
instance.find(table, key, callback)
table <String> 表名
key <Buffer|String>
callback <Function>
执行查找,key如果为String,在内部用utf8编码为Buffer后执行。
callback(err, value)。key在表中不存在,value == null,value为Buffer类型
instance.exist(table, key, callback)
table <String> 表名
key <Buffer|String>
callback <Function>
key如果为String,在内部用utf8编码为Buffer后执行。
callback(err, value)。key在表中不存在,value == false
instance.walk(table, [,from], callback)
table <String> 表名
from <Buffer|String>
callback <Function>
from如果为String,在内部用utf8编码为Buffer后执行。
遍历表,如果有from参数,从from的下一个键值对开始遍历。
callback(err, key, value)。key, value均为Buffer类型
instance.destroy()
关闭Edb实例连接,destroy之后执行的操作直接用实例已经关闭的错误回调。
edb.createEdb(path)
创建Edb实例的便捷方法,应用必须保证path目录存在,否则会抛出异常,结束当前代码片段的执行。
-
-