Node.js 的版本至少为 v12.0.0
安装 dmdb 包
创建项目文件夹,再项目文件下打开命令窗口
npm install dmdb
创建连接示例文件,内容如下:
执行代码:node dmtest.js
const db = require("dmdb"); //包含dmdb包路径
// 修改IP、端口、账号密码
const connStr = "dm://SYSDBA:DMdata456@192.168.43.3:5234?autoCommit=false&schema=SYSDBA";
(async function () {
let conn;
try {
conn = await db.getConnection(connStr);
const res = await conn.execute("SELECT 1 AS NUM FROM DUAL", [], {
outFormat: db.OUT_FORMAT_OBJECT
});
console.log("连接成功,结果:", res.rows);
} catch (e) {
console.error("连接失败:", e);
} finally {
if (conn) await conn.close();
}
})();
相关说明:
const res = await conn.execute("SELECT 1 AS NUM FROM DUAL", [], {
outFormat: db.OUT_FORMAT_OBJECT
});
`conn.execute(sql, bindParams, options)` 执行 SQL
`[]`:绑定参数数组,这条 SQL 没有占位参数,填空数组。
outFormat: db.OUT_FORMAT_OBJECT:返回行是 JS 对象 `{ NUM:1 }`,列名作为 key
插入查询数据
const db = require("dmdb");
// ========== 1、开启驱动调试日志(全局方式) ==========
db.LOG_LEVEL = 4; // 打开DEBUG日志,驱动会控制台输出底层交互
// 连接串也可以指定 logLevel,优先级高于全局属性
// logLevel=4 开启调试日志
const connStr = "dm://SYSDBA:DMdata456@192.168.43.3:5234?autoCommit=false&schema=SYSDBA&logLevel=4";
(async function () {
let conn;
try {
// 获取独立连接
conn = await db.getConnection(connStr);
console.log("数据库连接建立完成");
// ---------------------- 新增 INSERT ----------------------
const insertSql = `INSERT INTO TEST_USER(ID,USER_NAME,AGE) VALUES(:1,:2,:3)`;
// 插入第1行
await conn.execute(insertSql, [{val:1},{val:"张三"},{val:22}]);
// 插入第2行
await conn.execute(insertSql, [{val:2},{val:"李四"},{val:24}]);
// 插入第3行
await conn.execute(insertSql, [{val:3},{val:"王五"},{val:21}]);
console.log("执行插入完成");
// ---------------------- 查询 SELECT ----------------------
const selectAllSql = `SELECT ID,USER_NAME,AGE FROM TEST_USER`;
const queryAllRes = await conn.execute(selectAllSql, [], {
outFormat: db.OUT_FORMAT_OBJECT
});
console.log("查询全部数据:", queryAllRes.rows);
// 事务提交 autoCommit=false,必须手动commit
await conn.commit();
console.log("事务提交成功");
} catch (e) {
console.error("执行异常:", e);
// 异常回滚
if (conn) {
await conn.rollback();
console.log("已执行事务回滚");
}
} finally {
if (conn) {
await conn.close();
console.log("连接已关闭释放");
}
}
})();
修改删除数据
const db = require("dmdb");
// ========== 1、开启驱动调试日志(全局方式) ==========
db.LOG_LEVEL = 4; // 打开DEBUG日志,驱动会控制台输出底层交互
// 连接串也可以指定 logLevel,优先级高于全局属性
// logLevel=4 开启调试日志
const connStr = "dm://SYSDBA:DMdata456@192.168.43.3:5234?autoCommit=false&schema=SYSDBA&logLevel=4";
(async function () {
let conn;
try {
// 获取独立连接
conn = await db.getConnection(connStr);
console.log("数据库连接建立完成");
// ---------------------- 修改 UPDATE ----------------------
const updateSql = `UPDATE TEST_USER SET AGE=:age WHERE ID=:id`;
await conn.execute(updateSql, [
{ val: 23 },
{ val: 1 }
]);
console.log("执行更新完成");
// ---------------------- 删除 DELETE ----------------------
const deleteSql = `DELETE FROM TEST_USER WHERE ID=:id`;
await conn.execute(deleteSql, [{ val: 3 }]);
console.log("执行删除完成");
// ---------------------- 查询 SELECT ----------------------
const selectAllSql = `SELECT ID,USER_NAME,AGE FROM TEST_USER`;
const queryAllRes = await conn.execute(selectAllSql, [], {
outFormat: db.OUT_FORMAT_OBJECT
});
console.log("查询全部数据:", queryAllRes.rows);
// 事务提交 autoCommit=false,必须手动commit
await conn.commit();
console.log("事务提交成功");
} catch (e) {
console.error("执行异常:", e);
// 异常回滚
if (conn) {
await conn.rollback();
console.log("已执行事务回滚");
}
} finally {
if (conn) {
await conn.close();
console.log("连接已关闭释放");
}
}
})();
const db = require("dmdb");
db.LOG_LEVEL = 3;
const connectString = "dm://SYSDBA:DMdata456@192.168.43.3:5234?autoCommit=false&schema=SYSDBA";
let pool = null;
async function initPool() {
pool = await db.createPool({
connectString: connectString,
poolAlias: "multi_session_pool",
poolMax: 5, //池子最大5个会话
poolMin: 2, //初始化就创建2个空闲会话
poolTimeout: 60,
testOnBorrow: true,
validationQuery: "SELECT 1 FROM DUAL"
});
console.log("连接池初始化完成,poolMin=2,初始2个空闲会话");
}
(async function () {
await initPool();
// ========== 取出两个完全独立的会话 connA、connB ==========
let connA = null;
let connB = null;
try {
// 从池中获取2个不同会话
connA = await pool.getConnection();
connB = await pool.getConnection();
console.log("获取会话A、会话B");
// --------会话A:插入一条数据,不commit --------
const insertSql = `INSERT INTO TEST_USER(ID,USER_NAME,AGE) VALUES(:1,:2,:3)`;
await connA.execute(insertSql, [{ val: 10 }, { val: "A" }, { val: 30 }]);
console.log("会话A执行插入,尚未commit");
// 会话A自己查询:可以查到这条未提交数据(会话内可见)
const resA = await connA.execute("SELECT * FROM TEST_USER WHERE ID=10", [], { outFormat: db.OUT_FORMAT_OBJECT });
console.log("会话A查询ID=10:", resA.rows);
// --------会话B查询同一条ID=10,看不到未提交数据(隔离性) --------
const resB = await connB.execute("SELECT * FROM TEST_USER WHERE ID=10", [], { outFormat: db.OUT_FORMAT_OBJECT });
console.log("会话B查询ID=10(A未提交):", resB.rows);
// --------会话A提交事务 --------
await connA.commit();
console.log("会话A执行commit提交");
// --------提交后,会话B可以读到数据 --------
const resB2 = await connB.execute("SELECT * FROM TEST_USER WHERE ID=10", [], { outFormat: db.OUT_FORMAT_OBJECT });
console.log("会话B查询ID=10(A已提交):", resB2.rows);
} catch (e) {
console.error("异常:", e);
if (connA) await connA.rollback();
if (connB) await connB.rollback();
} finally {
// 归还两个会话到池子,不是销毁
if (connA) await connA.close();
if (connB) await connB.close();
console.log("会话A、B归还连接池");
// 关闭整个池子
await pool.close();
console.log("整个连接池销毁");
}
})();
文章
阅读量
获赞
