DM Node.js 编程指南

10.1 Node.js DM数据库驱动介绍

由于Node.js没有标准的数据库接口规范,故达梦公司根据达梦数据库的特点,为开发人员提供一套DM Node.js数据库驱动接口,其包名为dmdb。下面将详细介绍dmdb包在达梦数据库上的用法。

10.2 Node.js驱动包安装与环境准备

1.版本要求

Node.js的版本至少为v12.0.0。

2.使用npm install命令安装dmdb包

> npm install dmdb

上述命令会自动安装所需的依赖包,如iconv-lite、snappy。其中snappy需要node-gyp编译,如果安装过程报错,参考https://www.npmjs.com/package/node-gyp

3.在项目中引用dmdb包

const db = require("dmdb");

// your code

10.3 对象使用

10.3.1 dmdb对象

10.3.1.1常量

常量名 描述
dmdb.OUT_FORMAT_ARRAY 4001 获取结果集时,用数组来获取一行数据
dmdb.OUT_FORMAT_OBJECT 4002 获取结果集时,用json对象来获取一行数据,键为列名
dmdb.BLOB 2019 数据类型,Blob
dmdb.BUFFER 2006 数据类型,Buffer
dmdb.CLOB 2017 数据类型,Clob
dmdb.CURSOR 2021 数据类型,Cursor
dmdb.DATE 2014 数据类型,Date
dmdb.DEFAULT 0 默认数据类型
dmdb.NUMBER 2010 数据类型,Number
dmdb.STRING 2001 数据类型,String
dmdb.BIND_IN 3001 参数绑定方向,绑入
dmdb.BIND_INOUT 3002 参数绑定方向,绑入和绑出
dmdb.BIND_OUT 3003 参数绑定方向,绑出
dmdb.POOL_STATUS_CLOSED 6002 连接池状态,关闭
dmdb.POOL_STATUS_DRAINING 6001 连接池状态,正在关闭
dmdb.POOL_STATUS_OPEN 6000 连接池状态,打开
dmdb.STMT_TYPE_ALTER 7 alter语句
dmdb.STMT_TYPE_BEGIN 8 begin语句
dmdb.STMT_TYPE_CALL 10 call语句
dmdb.STMT_TYPE_COMMIT 21 commit语句
dmdb.STMT_TYPE_CREATE 5 create语句
dmdb.STMT_TYPE_DECLARE 9 declare语句
dmdb.STMT_TYPE_DELETE 3 delete语句
dmdb.STMT_TYPE_DROP 6 drop语句
dmdb.STMT_TYPE_EXPLAIN_PLAN 15 explain plan语句
dmdb.STMT_TYPE_INSERT 4 insert语句
dmdb.STMT_TYPE_MERGE 16 merge语句
dmdb.STMT_TYPE_ROLLBACK 17 rollback语句
dmdb.STMT_TYPE_SELECT 1 select语句
dmdb.STMT_TYPE_UNKNOWN 0 未知类型语句
dmdb.STMT_TYPE_UPDATE 2 update语句

10.3.1.2属性

以下属性的修改会影响由dmdb创建出来的Pool和Connection对象。

属性名 类型 描述
autoCommit Boolean 语句执行后,是否自动提交,默认true
extendedMetaData Boolean 查询结果集中metadata是否要扩展,默认false
fetchAsBuffer Array 指定结果集中的数据类型以Buffer显示,可选值:dmdb.BLOB
fetchAsString Array 指定结果集中的数据类型以String显示,可选值:dmdb.BUFFER、dmdb.CLOB、dmdb.DATE、dmdb.NUMBER
outFormat Number 查询结果的格式,取值为dmdb.OUT_FORMAT_ARRAY或dmdb.OUT_FORMAT_OBJECT,表示格式化成数组还是json对象,默认dmdb.OUT_FORMAT_ARRAY
poolMax Number 最大连接数,默认4
poolMin Number 最小连接数,默认0
poolTimeout Number 连接闲置多久后自动关闭,单位秒,默认60

10.3.1.3函数原型

  1. createPool
函数原型 功能说明
createPool(poolAttrs) 根据配置创建连接池,返回promise对象
createPool(poolAttrs, callback) 根据配置创建连接池,执行回调函数

参数

  1. poolAttrs(Object):JS对象,配置连接池属性,如连接串、最大连接数等。具体如下:
属性名 类型 描述
connectString/connectionString String 连接串,必选
poolAlias String 连接池别名,可选
poolMax Number 最大连接数,默认4,可选
poolMin Number 最小连接数,默认0,可选
poolTimeout Number 连接闲置多久后自动关闭,单位秒,默认60,0代表永不关闭闲置连接,可选
testOnBorrow Boolean 连接获取前是否验证有效性,如果连接失效,则继续取池中其他连接,可选
validationQuery String 连接有效性检查使用的SQL语句,必须至少有一行结果集,默认”select 1;”,可选
  1. callback(Function):执行完createPool后的回调函数。参数如下:
回调函数参数 描述
Error error 若创建连接池失败,error不为空
Pool pool 若创建连接池成功,pool为函数返回的Pool对象

下面通过一个简单的例子来说明创建连接池。

// 回调函数

db.createPool({

connectString: "dm://SYSDBA:SYSDBA\@localhost:5236"

},

function(err, pool) {

do_something_with_pool();

}

)

// Promise

db.createPool({

connectString: "dm://SYSDBA:SYSDBA\@localhost:5236",

poolMin: 1,

poolMax: 3,

poolAlias: "DM5236"

}).then(function(pool) {

do_something_with_pool();

}) .catch(function(err) {

console.log(err);

})

若无特别说明,本章下文示例中使用的都是回调函数。

  1. getConnection
函数原型 功能说明
getConnection(poolAlias) 从指定连接池中获取连接,返回promise对象
getConnection(poolAlias, callback) 从指定连接池中获取连接,执行回调函数
getConnection(connURL) 根据配置创建连接,返回promise对象
getConnection(connURL, callback) 根据配置创建连接,执行回调函数
getConnection(connAttrs) 根据连接属性创建连接,返回promise对象
getConnection(connAttrs, callback) 根据连接属性创建连接,执行回调函数

参数

  1. poolAlias(String):连接池别名
  2. connURL(String):连接串
  3. connAttrs(Object):连接属性,具体字段如下:
字段名 类型 描述
connectString String 连接串,与connectionString二选一,connectString更优先,格式 host:port或服务名
connectionString String 连接串,与connectString二选一,connectString更优先,格式 host:port或服务名
user String 登录用户名
password String 登录密码
其余字段:与连接串属性相同,参考10.4节 …… ……
  1. callback(Function):执行完getConnection后的回调函数。参数如下:
回调函数参数 描述
Error error 若创建连接失败,error不为空
Conection connection 若获取连接成功,connection为函数返回的Connection对象

下面通过一个简单的例子来说明创建连接。

db.getConnection("dm://SYSDBA:SYSDBA\@localhost:5236", function(err, connection)
{

do_something_with_connection();

})
  1. getPool
函数原型 功能说明
getPool(poolAlias) 获取Pool连接池对象

参数

poolAlias(String):连接池别名

下面通过一个简单的例子来说明获取连接池。

db.createPool(

{

poolAlias: "DM5236",

connectString: "dm://SYSDBA:SYSDBA@localhost:5236"

},

function(err, pool) {

console.log(pool === db.getPool("DM5236")); // true

}

)

10.3.2 Connection对象

10.3.2.1函数原型

  1. close/release
函数原型 功能说明
close()/release() 关闭连接,返回promise对象
close(callback)/release(callback) 关闭连接,执行回调函数

参数

callback(Function):执行完close/release后的回调函数。参数如下:

回调函数参数 描述
Error error 若断开连接失败,error不为空

下面通过一个简单的例子来说明关闭连接。

conn.close(function(err) {

console.log(err);

})
  1. commit
函数原型 功能说明
commit() 提交事务,返回promise对象
commit(callback) 提交事务,执行回调函数

参数

callback(Function):执行完commit后的回调函数。参数如下:

回调函数参数 描述
Error error 若提交失败,error不为空

下面通过一个简单的例子来说明提交事务。

conn.commit(function(err) {

console.log(err);

})

  1. createLob
函数原型 功能说明
createLob(type) 创建Lob对象,返回promise对象
createLob(type, callback) 创建Lob对象,执行回调函数

参数

  1. type(Number):Lob对象类型,取值为dmdb.CLOB或dmdb.BLOB
  2. callback(Function):执行完createLob后的回调函数。参数如下:
回调函数参数 描述
Error error 若创建Lob失败,error不为空
Lob lob 若创建Lob成功,lob为函数返回的Lob对象

下面通过一个简单的例子来说明创建LOB对象。

conn.createLob(dmdb.CLOB, function(err, lob) {

do_something_with_lob();

})
  1. execute
函数原型 功能说明
execute(sql, [bindParams, [options]]) 执行语句,返回promise对象
execute(sql, [bindParams, [options]], callback) 执行语句,执行回调函数

参数

  1. sql(String):SQL或PL/SQL语句,可包含绑定变量
  2. bindParams(Object):绑定参数,按照名称绑定时,为JS对象,按照位置绑定时,为Array数组。可配置属性具体如下:
绑定属性 类型 描述
dir Number 绑定的方向,取值为dmdb.BIND_IN,dmdb.BIND_INOUT,dmdb.BIND_OUT其一,默认dmdb.BIND_IN
val Object 变量以IN或IN OUT方式绑定时,可设置输入值
  1. options(Object):语句执行的选项,为JS对象。可配置属性具体如下:
属性 类型 描述
extendedMetaData Boolean 覆盖dmdb.extendedMetaData
fetchInfo Object 结果集列以何种JavaScript类型展示,可以覆盖全局设置dmdb.fetchAsString和dmdb.fetchAsBuffer. 例如: fetchInfo: { “COL_NAME_DATE”: { type: dmdb.STRING}, “COL_NAME_ANY”: { type: dmdb.DEFAULT} } 其中type的值可以是: dmdb.STRING,对于数字,日期时间,二进制数据,CLOB的结果集列返回String; dmdb.BUFFER,对于BLOB的结果集列返回Buffer; dmdb.DEFAULT,覆盖dmdb.fetchAsString和dmdb.fetchAsBuffer设置,结果集列返回原始数据;
outFormat Number 覆盖dmdb.outFormat
resultSet Boolean 查询结果是否返回ResultSet对象,默认false
  1. callback(Function):执行完execute后的回调函数。参数如下:
回调函数参数 描述
Error error 若执行语句失败,error不为空
Object result 若执行语句成功,result为函数返回结果,包含的字段可能有:metaData、implicitResults 、outBinds、resultSet、rows、rowsAffected
其中各字段含义如下:
metaData:查询语句的列信息,当且仅当有多个结果集时为二维数组,含如下字段:
name:列名
dbType:列类型
dbTypeName:列类型名称
precision:列数据精度
scale:列数据标度
nullable:列是否可为空
implicitResults:当有多个结果集时,结果保存在此字段中
outBinds:绑出参数
resultSet:查询语句的结果集,当执行选项的resultSet为false时,resultSet为undefined
rows:查询语句的所有结果行,当执行选项的resultSet为true时,rows为undefined
rowsAffected:DML语句影响行数。对于非DML语句(如select、PL/SQL),rowsAffected为undefined

下面通过一个简单的例子来说明执行语句。

conn.execute(

	"select name, id from sysobjects where name = :na",

	{ na: { val: 'SYSDBA', dir: db.BIND_IN } },

	{ resultSet: false },

	function(err, result) {

	do_something_with_result();

	}

)
  1. executeMany
函数原型 功能说明
executeMany(sql, binds, [options]) 批量执行语句,返回promise对象
executeMany(sql, numIterations, [options]) 批量执行语句,返回promise对象
executeMany(sql, binds, [options], callback) 批量执行语句,执行回调函数
executeMany(sql, numIterations, [options], callback) 批量执行语句,执行回调函数

参数

  1. sql(String):SQL或PL/SQL语句,必须包含绑定变量
  2. binds(Array):绑定参数,按照名称绑定时,为JS对象组成的Array数组,按照位置绑定时,为Array数组组成的Array数组
  3. numIterations(Number):SQL或PL/SQL语句执行次数
  4. options(Object):语句执行的选项,为JS对象。可配置属性具体如下:
属性 类型 描述
batchErrors Boolean 为true时,遇到数据库报错后,仍会执行之后的数据行,默认false
bindDefs Object 包含dir字段,详细描述见execute方法的参数bindParams中的dir字段
dmlRowCounts Boolean 结果中是否显示批量执行影响行数,默认false
  1. callback(Function):执行完executeMany后的回调函数。参数如下:
回调函数参数 描述
Error error 若批量执行语句失败,error不为空
Object result 若批量执行语句成功,result为函数返回结果,包含的字段可能有:batchErrors、dmlRowCounts、outBinds、rowsAffected
其中各字段含义如下:
batchError:批量执行错误列表
dmlRowCounts:批量执行每一次影响的行数
outBinds:绑出参数
rowsAffected:语句影响行数

下面通过一个简单的例子来说明executeMany用法。

conn.executeMany(

	"insert into PERSON values(:1, :2, :3)",

	[	[101, '张三', '男'],	[102, '李四', '女'] ],

	{

	dmlRowCounts: true,

	batchErrors: true,

	bindDefs: [	{ dir: db.BIND_IN },{ dir: db.BIND_IN },{ dir: db.BIND_IN }	]

	},

	function(err, result) {	do_something_with_result();	}

)
  1. getStatementInfo
函数原型 功能说明
getStatementInfo(sql) 分析sql语句信息,返回promise对象
getStatementInfo(sql, callback) 分析sql语句信息,执行回调函数

参数

  1. sql(String):SQL语句
  2. callback(Function):执行完getStatementInfo后的回调函数。参数如下:
回调函数参数 描述
Error error 若分析sql语句信息失败,error不为空
Object information 若分析sql语句信息成功,information为函数返回结果,包含的字段有:bindNames、metaData、statementType

下面通过一个简单的例子来说明getStatementInfo的用法。

conn.getStatementInfo("select name from person where id = :i", function (err,info) {

do_something_with_info();

})
  1. rollback
函数原型 功能说明
rollback() 回滚,返回promise对象
rollback(callback) 回滚,执行回调函数

参数

callback(Function):执行完rollback后的回调函数。参数如下:

回调函数参数 描述
Error error 若回滚失败,error不为空

下面用一个简单的例子来说明rollback的用法。

conn.rollback(function (err) {

do_something_with_err();

})

10.3.3 Lob对象

10.3.3.1属性

属性名 类型 描述
type Number 值为dmdb.BLOB、dmdb.CLOB其一,只读

10.3.3.2函数原型

  1. close

使用createLob()创建的Lob对象应调用close()关闭

函数原型 功能说明
close() 关闭Lob,返回promise对象
close(callback) 关闭Lob,执行回调函数

参数

callback(Function):执行close后的回调函数。参数如下:

回调函数参数 描述
Error error 若关闭Lob失败,error不为空

下面用一个简单的示例来说明close()的用法。

lob.close(function(err) {

console.log(err);

})
  1. getData

获取Lob对象中存储的全部数据,对于BLOB,返回为Buffer;对于CLOB,返回为String

函数原型 功能说明
getData() 获取Lob全部数据,返回promise对象
getData(callback) 获取Lob全部数据,执行回调函数

参数

callback(Function):执行getData后的回调函数。参数如下:

回调函数参数 描述
Error error 若获取Lob全部数据失败,error不为空
String|Buffer data Lob存储的全部数据

下面用一个简单的示例来说明getData()的用法。

lob.getData(function(err, data) {

do_something_with_data();

})
  1. getLength

获取Lob对象的长度,对于BLOB,返回为字节数组长度;对于CLOB,返回为字符串字符数

函数原型 功能说明
getLength() 获取Lob长度,返回promise对象
getLength(callback) 获取Lob长度,执行回调函数

参数

callback(Function):执行getLength后的回调函数。参数如下:

回调函数参数 描述
Error error 若获取Lob全部数据失败,error不为空
Number length Lob的长度

下面用一个简单的示例来说明getLength()的用法。

lob.getLength(function(err, length) {

do_something_with_length();

})

10.3.4 Pool对象

10.3.4.1属性

属性名 类型 描述
connectionsInUse Number 连接池中正在使用的连接数,只读
connectionsOpen Number 连接池中已打开的连接数,只读
poolAlias String createPool()指定的连接池别名,只读
poolMax Number 最大连接数,只读
poolMin Number 最小连接数,只读
poolTimeout Number 连接闲置多久后自动关闭,单位秒,只读
testOnBorrow Boolean 连接获取前是否验证有效性,只读
validationQuery String 连接有效性检查使用的SQL语句,只读
status Number 连接池状态,只读

10.3.4.2函数原型

  1. close/terminate
函数原型 功能说明
close()/terminate() 关闭连接池,返回promise对象
close(callback)/terminate(callback) 关闭连接池,执行回调函数

参数

callback(Function):执行close/terminate后的回调函数。参数如下:

回调函数参数 描述
Error error 若关闭连接池失败,error不为空

下面通过一个简单的示例来说明close的用法。

pool.close(function(err) {

console.log(err);

})
  1. getConnection
函数原型 功能说明
getConnection() 从连接池中获取数据库连接,返回promise对象
getConnection(callback) 从连接池中获取数据库连接,执行回调函数

参数

callback(Function):执行getConnection后的回调函数。参数如下:

回调函数参数 描述
Error error 若获取数据库连接失败,error不为空
Connection conn 若获取数据库连接成功,conn为函数返回的Connection对象

下面用一个简单的示例来说明getConnection的用法。

pool.getConnection(function(err, conn) {

do_something_with_conn();

})

10.3.5 ResultSet对象

ResultSet对象每次可以从数据库中获取一行或多行数据。当查询结果集很大,或不知道结果集行数时,建议使用ResultSet对象。

10.3.5.1函数原型

  1. close
函数原型 功能说明
close() 关闭结果集,返回promise对象
close(callback) 关闭结果集,执行回调函数

参数

callback(Function):执行close后的回调函数。参数如下:

回调函数参数 描述
Error error 若关闭结果集失败,error不为空

下面通过一个简单的示例来说明close()的用法。

resultSet.close(function(err) {

do_something_with_err();

})
  1. getRow
函数原型 功能说明
getRow() 获取结果集中的下一行,返回promise对象
getRow(callback) 获取结果集中的下一行,执行回调函数

参数

callback(Function):执行getRow后的回调函数。参数如下:

回调函数参数 描述
Error error 若获取结果集中的下一行失败,error不为空
Object row 若获取结果集中的下一行成功,row为返回的结果集中的下一行

下面用一个简单的示例来说明getRow的用法。

resultSet.getRow(function(err, row) {

do_something_with_row();

})
  1. getRows
函数原型 功能说明
getRows(numRows) 获取结果集中的多行,返回promise对象
getRows(numRows, callback) 获取结果集中的多行,执行回调函数

参数

  1. numRows(Number):要获取的行数
  2. callback(Function):执行getRows后的回调函数。参数如下:
回调函数参数 描述
Error error 若获取结果集中的多行失败,error不为空
Array rows 若获取结果集中的多行成功,row为返回的结果集中行组成的数组

下面用一个简单的示例来说明getRows的用法。

resultSet.getRows(10, function(err, rows) {

do_something_with_rows();

})
  1. getRowCount
函数原型 功能说明
getRowCount() 获取结果集总行数,返回promise对象
getRowCount(callback) 获取结果集总行数,执行回调函数

参数

  1. callback(Function):执行getRowCount后的回调函数。参数如下:
回调函数参数 描述
Error error 若获取结果集中的多行失败,error不为空
Number rowCount 若获取结果集总行数成功,rowCount为返回的结果集总行数

下面用一个简单的示例来说明getRowCount的用法。

resultSet.getRowCount(function(err, rowCount) {

	do_something_with_rowCount();

})

10.4 连接串可配置属性

连接串基本格式:

dm://user:password@host:port[?propName1=propValue1][&propName2=propValue2]…

连接串中可以设置的属性及其说明见下表。

表10.1 Node.js连接串属性
属性名称 类型 说明
addressRemap String 地址重定向,格式:(IP_1:PORT_1,IP_2:PORT_2),如:addressRemap=(192.168.0.1:5236,localhost:5237),如果连接192.168.0.1:5236,则实际连接到localhost:5237。可以配置多个地址重定向,如:addressRemap=(localhost:5236,localhost:5237)(localhost:5238,localhost:5239),默认空
alwaysAllowCommit Boolean 在自动提交开关打开时,是否允许手动提交回滚,默认true
appName String 客户端应用程序名称,默认空
autoCommit Number 是否自动提交,默认true
batchAllowMaxErrors Number continueBatchOnError开启时,最大可容错行数,超过则停止执行,但不报错,有效值范围0~65535,默认0,表示无限制
batchNotOnCall Boolean 存储过程是否不批量执行,默认false,取值(true,false)
batchType Number 批处理类型,默认1,取值(1:进行批量绑定;2:不进行批量绑定)
bufPrefetch Number 结果集fetch预取消息buffer大小;单位KB,有效值范围32~65535。默认0,表示按服务器配置。
cluster String 当doSwitch=2,epSelector=1时,用于检测DSC集群节点故障恢复是否成功,默认空,取值(DSC)
continueBatchOnError Boolean 批量执行出错时是否继续执行;默认false
columnNameUpperCase Boolean 列名是否全部大写,默认false,取值(true,false)
columnNameCase String 列名大小写显示策略,默认空,取值(upper,lower)
compatibleMode String 兼容其他数据库, 属性值为数据库名称(例如:oracle),支持兼容oracle和mysql
compress Number 是否压缩消息。0:不压缩;1:完全压缩;2:优化的压缩;默认0
compressId Number 压缩算法。0:ZLIB压缩;1:SNAPPY压缩;默认0
connectTimeout Number 连接数据库超时时间,单位ms,取值范围:0~2147483647,默认5000
doSwitch Number 连接发生异常或一些特殊场景下的连接处理策略。0:关闭连接;1:当连接发生异常时自动切换到其他库,无论切换成功还是失败都会报错,用于通知上层应用进行事务执行失败时的相关处理;2:配合epSelector=1使用,如果服务名列表前面的节点恢复了,将当前连接切换到前面的节点上;默认0
enRsCache Boolean 是否开启结果集缓存;默认false;取值(true,false)
epSelector Number 服务名连接策略。0:依次选取列表中的不同节点建立连接,使得所有连接均匀地分布在各个节点上;1:选择列表中最前面的节点建立连接,只有当前节点无法建立连接时才会选择下一个节点进行连接;默认0
escapeProcess Boolean 是否进行语法转义处理,默认false;取值(true,false)
isBdtaRS Boolean 是否使用列模式结果集,默认false;取值(true,false)
lobMode Number Lob模式,默认1;取值(1 分批缓存到本地,2 一次将大字段数据缓存到本地)
localTimezone Number 客户端本地时区,单位min,取值范围-720~720
logDir String 日志等其他一些驱动过程文件生成目录,默认值是当前工作目录
logFlushFreq Number 日志刷盘频率,单位s,取值范围:0~2147483647,默认10
loginCertificate String 该参数用于指定dmkey工具生成的公钥文件路径,非加密通信的情况下,可对登录用户名密码进行增强加密;
loginDscCtrl Boolean 服务名连接数据库时是否只选择dsc control节点的库,默认false,取值(true,false)
loginEncrypt Number 是否进行通信加密,默认true;取值(true/True,false/False)
loginMode Number 指定优先登录的服务器模式。0:优先连接PRIMARY模式的库,NORMAL模式次之,最后选择STANTBY模式;1:只连接主库;2:只连接备库;3:优先连接STANDBY模式的库,PRIMARY模式次之,最后选择NORMAL模式;4:优先连接NORMAL模式的库,PRIMARY模式次之,最后选择STANDBY模式;默认4;
loginStatus Number 服务名方式连接数据库时只选择状态匹配的库; 0表示不限制;3表示mount状态;4 表示open状态;5 表示suspend状态;默认0;
logLevel String 生成日志的级别,日志按从低到高依次如下(off:不记录;error:只记录错误日志;warn:记录警告信息;sql:记录sql执行信息;info:记录全部执行信息;all:记录全部),默认off,高级别同时记录低级别的信息
maxRows Number 结果集行数限制,若超过上限,则对结果集进行截断,取值范围:0~2147483647,默认0,表示无限制
mppLocal Boolean 是否MPP本地连接,默认false;取值(true,false)
osName String 操作系统名称,默认空
rsCacheSize Number 结果集缓存区大小,单位MB,默认20,范围1~65536
rsRefreshFreq Number 结果集缓存检查更新的频率,单位秒,默认10,范围0~10000;如果设置为0,则不需检查更新;
rwHA Boolean 是否开启读写分离系统高可用;取值1/0 或 true/false;默认false;
rwIgnoreSql Boolean 读写分离是否忽略sql类型,并按比例分发到主/备库,默认false,取值(true,false)
rwPercent Number 分发到主库的事务占主备库总事务的百分比,有效值0~100,默认25
rwSeparate Boolean 是否使用读写分离系统,默认false;取值(false不使用,true使用)
rwStandbyRecoverTime Number 读写分离系统备库故障恢复检测频率,单位ms,取值范围:0~2147483647,默认1000;0表示不恢复
schema String 指定用户登录后的当前模式,默认为用户的默认模式
sessionTimeout Number 会话超时时间,单位s,取值范围:0~2147483647,默认0
socketTimeout Number 网络通讯超时时间,单位ms。取值范围0~2147483647,默认0。0表示无超时限制。如果配置了该参数,将导致执行耗时大于超时时间的数据库操作报错
stmtPoolSize Number 语句句柄池大小,取值范围:0~2147483647,默认15
sslPath String 指定ssl加密证书文件、密钥文件、CA证书文件的目录,目录内必须包含client-cert.pem、client-key.pem、ca-cert.pem
svcConfPath Number 自定义客户端配置文件(dm_svc.conf)的完整路径
switchInterval Number 服务名连接数据库时,若遍历了服务名中所有库列表都未找到符合条件的库成功建立连接,等待一定时间再继续下一次遍历;单位ms,取值范围:0~2147483647,默认1000
switchTimes Number 服务名连接数据库时,若未找到符合条件的库成功建立连接,将尝试遍历服务名中库列表的次数,取值范围:0~2147483647,默认1
userRemap String 用户名重定向,格式:(USER1,USER2),如:userRemap=(USER1,USER2),如果使用USER1用户连接,则实际连接用户为USER2。可以配置多个重定向,如:userRemap=(USER1,USER2)(USER3,USER4),默认空

10.5 基本示例

下面用一个具体的编程实例来展示利用Node.js驱动程序进行数据库操作。

/*该例程实现插入数据,修改数据,删除数据,数据查询等基本操作。*/

// 引入dmdb包

var db = require('dmdb');

var fs = require('fs');

var pool, conn;

async function example() {

try {

pool = await createPool();

conn = await getConnection();

await insertTable();

await updateTable();

await queryTable();

await queryWithResultSet();

await deleteTable();

} catch (err) {

console.log(err);

} finally {

try {

await conn.close();

await pool.close();

} catch (err) {}

}

}

example();

/* 创建连接池 */

async function createPool() {

try {

return db.createPool({

connectString: "dm://SYSDBA:SYSDBA@localhost:5236?autoCommit=false",

poolMax: 10,

poolMin: 1

});

} catch (err) {

throw new Error("createPool error: " + err.message);

}

}

/* 获取数据库连接 */

async function getConnection() {

try {

return pool.getConnection();

} catch (err) {

throw new Error("getConnection error: " + err.message);

}

}

/* 往产品信息表插入数据 */

async function insertTable() {

try {

var sql = "INSERT INTO production.product(name,author,publisher,publishtime,"

\+
"product_subcategoryid,productno,satetystocklevel,originalprice,nowprice,discount,"

\+ "description,photo,type,papertotal,wordtotal,sellstarttime,sellendtime) "

\+ "VALUES(:1,:2,:3,:4,:5,:6,:7,:8,:9,:10,:11,:12,:13,:14,:15,:16,:17);";

var blob = fs.createReadStream("c:\\三国演义.jpg");

await conn.execute(

sql,

[

{ val: "三国演义" },

{ val: "罗贯中" },

{ val: "中华书局" },

{ val: new Date("2005-04-01") },

{ val: 4 },

{ val: "9787101046121" },

{ val: 10 },

{ val: 19.0000 },

{ val: 15.2000 },

{ val: 8.0 },

{ val:"《三国演义》是中国第一部长篇章回体小说,中国小说由短篇发展至长篇的原因与说书有关。"
},

{ val: blob },

{ val: "25" },

{ val: 943 },

{ val: 93000 },

{ val: new Date("2006-03-20") },

{ val: new Date("1900-01-01") }

]

);

} catch (err) {

throw new Error("insertTable error: " + err.message);

}

}

/* 修改产品信息表数据*/

async function updateTable() {

try {

var sql = "UPDATE production.product SET name = :name " + "WHERE productid = 11;";

// 按名称绑定变量

return conn.execute(sql, { name: { val: "三国演义(上)" } });

} catch (err) {

throw new Error("updateTable error: " + err.message);

}

}

/* 删除产品信息表数据 */

async function deleteTable() {

try {

var sql = "DELETE FROM production.product WHERE productid = 11;"

return conn.execute(sql);

} catch (err) {

throw new Error("deleteTable error: " + err.message);

}

}

/* 查询产品信息表 */

async function queryTable() {

try {

var sql = "SELECT productid,name,author,publisher,photo FROM production.product"

var result = await conn.execute(sql);

var lob = result.rows[result.rows.length - 1][4];

var buffer = await readLob(lob);

// Lob对象使用完需关闭

await lob.close();

console.log(buffer);

return result;

} catch (err) {

throw new Error("queryTable error: " + err.message);

}

}

/* 读取数据库返回的Lob对象 */

function readLob(lob) {

return new Promise(function (resolve, reject) {

var blobData = Buffer.alloc(0);

var totalLength = 0;

lob.on('data', function (chunk) {

totalLength += chunk.length;

blobData = Buffer.concat([blobData, chunk], totalLength);

});

lob.on('error', function (err) {

reject(err);

});

lob.on('end', function () {

resolve(blobData);

});

});

}

/* 结果集方式查询产品信息表 */

async function queryWithResultSet() {

try {

var sql = "SELECT productid,name,author,publisher FROM production.product";

var result = await conn.execute(sql, [], { resultSet: true });

var resultSet = result.resultSet;

// 从结果集中获取一行

result = await resultSet.getRow();

while (result) {

console.log(result);

result = await resultSet.getRow();

}

} catch (err) {

throw new Error("queryWithResultSet error: " + err.message);

}

}
微信扫码
分享文档
扫一扫
联系客服