惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

L
LINUX DO - 最新话题
G
Google Developers Blog
J
Java Code Geeks
The GitHub Blog
The GitHub Blog
F
Full Disclosure
H
Help Net Security
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Vercel News
Vercel News
酷 壳 – CoolShell
酷 壳 – CoolShell
Recent Announcements
Recent Announcements
Help Net Security
Help Net Security
The Hacker News
The Hacker News
IT之家
IT之家
Y
Y Combinator Blog
Martin Fowler
Martin Fowler
L
Lohrmann on Cybersecurity
C
CERT Recently Published Vulnerability Notes
V
Visual Studio Blog
博客园 - 聂微东
Hacker News: Ask HN
Hacker News: Ask HN
H
Hacker News: Front Page
Know Your Adversary
Know Your Adversary
Security Latest
Security Latest
Security Archives - TechRepublic
Security Archives - TechRepublic
Simon Willison's Weblog
Simon Willison's Weblog
www.infosecurity-magazine.com
www.infosecurity-magazine.com
T
Troy Hunt's Blog
Last Week in AI
Last Week in AI
Schneier on Security
Schneier on Security
N
News and Events Feed by Topic
博客园 - 【当耐特】
有赞技术团队
有赞技术团队
AWS News Blog
AWS News Blog
Blog — PlanetScale
Blog — PlanetScale
博客园_首页
Google DeepMind News
Google DeepMind News
Cloudbric
Cloudbric
N
News | PayPal Newsroom
A
About on SuperTechFans
S
Schneier on Security
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Hugging Face - Blog
Hugging Face - Blog
M
MIT News - Artificial intelligence
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
雷峰网
雷峰网
T
The Exploit Database - CXSecurity.com
罗磊的独立博客
K
Kaspersky official blog
The Cloudflare Blog
I
Intezer

博客园 - 悠哉大斌

AI Agent 安全沙箱技术对比:E2B、Cube Sandbox 与 Docker Sandboxes linux 升级 claude code的坑 debian(WSL) apt 代理配置 linux内核之Namespaces、Cgroups、Capabilities、Seccomp和Landlock 大语言模型推理中的隐藏瓶颈及其解决方法 Docker Sandboxes 技术是什么,和docker容器有什么区别 什么是 Docker Agent以及一个Docker Agent示例 windows wsl 安装 Temurin® JDK claude Code 和 codex 作为编程代理,前者使用typescript开发,后者使用rust,他们的决策依据是什么 Java 并发编程发展史与 java.util.concurrent 全景解析 LLM 真的改变了编码风格吗? 如果人工智能会犯错且不精确,为什么它正在改变世界? Python 的协程模型和 JavaScript 的 async/await python闭包和function.__closure__特殊属性 python 的 dunder name和 sunder name 基于nodejs设计REST API的知名开源框架 Claude Code CLI连接 DeepSeek V4模型后调用报400错误 python里对象(object)到底是什么 Python 泛型演变史 Python 类型别名的演变 Python 类型提示的演变史 PEP 593 新增的Annotated 类型 Alibaba AgentScope 和 microsoft agent framework 详细对比分析 spring AI Alibaba Agent Framework 和 agentscope有什么区别和联系 AI Agent协作模式以及主流开源框架对协作模式的支持 Tailscale 是如何接管 DNS 的? Agent = Model + Harness 使用rust编写typescript编译器的难点在什么地方,哪些数据结构是rust不擅长的? TypeScript/JavaScript 中的异步迭代语句 js中的生成器函数 Tailscale Serve and Funnel openclaw gateway的网络绑定模式 websocket协议和http协议有何依赖关系? MCP通信的双方是谁? claude code MCP 安装范围 如何在wsl2环境下给claude code cli 配置 playwright-mcp wsl的网络模式有哪几种,有哪些区别? AI Agent memory是什么? ai agent skills是什么? Go测试生态系统工具与最佳实践深度调研(聚焦认证授权系统) 线性代数中常见矩阵类型的概念关系思维导图 三种主流授权策略
windows上使用node-oracledb Thick 模式连接 Oracle 11g
悠哉大斌 · 2026-04-30 · via 博客园 - 悠哉大斌

连接 Oracle 11g 时,必须使用 Thick 模式

Oracle 11g 是一个相对较早的版本,而 node-oracledb 默认的 Thin 模式(纯 JavaScript 实现)只支持 Oracle 数据库 12.1 或更高版本。连接 11g 会引发 NJS-138 错误,提示该版本在 Thin 模式下不受支持。因此,必须切换到功能更全面、兼容性更好的 Thick 模式。


🛠️ Windows 下启用 Thick 模式的详细步骤

1️⃣ 第一步:安装 Oracle Instant Client

Thick 模式需要通过 Oracle 的本地客户端库来通信,最简单的方式就是下载并安装 Oracle Instant Client

  • 下载:访问 Oracle Instant Client 下载页,选择与你的操作系统匹配的 Basic 或 Basic Light 版本。需要注意,Windows 版通常有 32 位和 64 位之分,请确保与你安装的 Node.js 版本位数一致。如果数据库版本是 11g,选择 Instant Client 11.2 或更高版本即可。

  • 解压:将下载的 ZIP 文件解压到一个你容易找到的路径,例如 C:\oracle\instantclient_19_14

  • 配置环境变量:将这个解压路径添加到系统的 PATH 环境变量中,以便系统能找到这些库文件。

    手动设置 PATH 的方法

    1. 在 Windows 搜索栏输入“环境变量”,选择“编辑系统环境变量”。
    2. 在弹出的窗口中点击“环境变量”。
    3. 在“系统变量”列表中找到 Path 变量,选中后点击“编辑”。
    4. 点击“新建”,将你的 Instant Client 路径(例如 C:\oracle\instantclient_19_14)粘贴进去,然后一直点击“确定”保存。

2️⃣ 第二步:编写代码启用 Thick 模式

在 Node.js 代码中,你需要在建立任何数据库连接之前调用 oracledb.initOracleClient() 函数,并指定客户端库的路径。如果你的环境变量设置正确,libDir 选项可以省略。

// 引入 node-oracledb 模块
const oracledb = require('oracledb');

// 1. 初始化 Oracle 客户端,启用 Thick 模式
// 推荐在应用启动时调用一次
try {
    // 如果 Instant Client 已正确配置在 PATH 中,可以省略 libDir 参数
    // 如果未配置 PATH,则需要显式指定路径,注意 Windows 路径中的反斜杠需要转义
    // oracledb.initOracleClient({ libDir: 'C:\\oracle\\instantclient_19_14' });
    oracledb.initOracleClient(); 
    console.log('Thick 模式已启用');
} catch (err) {
    console.error('初始化 Oracle 客户端失败:', err);
    process.exit(1);
}

// 2. 配置数据库连接参数
const dbConfig = {
    user: 'your_username',        // 替换为你的数据库用户名
    password: 'your_password',    // 替换为你的数据库密码
    connectString: 'hostname:port/service_name' // 替换为你的数据库连接字符串
};

// 3. 连接数据库
async function run() {
    let connection;
    try {
        connection = await oracledb.getConnection(dbConfig);
        console.log('成功连接到 Oracle 数据库 (Thick 模式)');

        // 执行你的数据库操作
        // const result = await connection.execute(`SELECT 'Hello, Oracle!' FROM DUAL`);
        // console.log(result.rows);

    } catch (err) {
        console.error('数据库连接失败:', err);
    } finally {
        if (connection) {
            try {
                await connection.close();
                console.log('数据库连接已关闭');
            } catch (err) {
                console.error('关闭连接失败:', err);
            }
        }
    }
}

run();

💡 常见问题与排查

  1. DPI-1047: Cannot locate Oracle Client library:这个错误最常见,表示 Node.js 找不到 Oracle 客户端库。请确认 Instant Client 的路径已正确添加到系统 PATH 环境变量中,并重启了命令行或终端。
  2. NJS-045: cannot load a node-oracledb Thick mode binary:通常是因为 Node.js 的位数(32/64 位)与 Instant Client 的位数不匹配,请重新下载并安装对应位数的版本。
  3. NJS-138: connections to this database server version are not supported...:如果在 Thin 模式下遇到此错误,说明你尚未切换到 Thick 模式。请确认你是否在代码中正确调用了 initOracleClient()
  4. 数据库密码验证错误:如果 Thick 模式配置正确但仍无法连接,可能是数据库密码的哈希算法过旧(例如从 10g 时代遗留的密码)。一种快速的解决方法是重置该数据库用户的密码,这通常会使用更新、更标准的算法来重新哈希密码,从而解决问题。

参考链接

https://node-oracledb.readthedocs.io/en/latest/user_guide/installation.html#installing-node-js-and-node-oracledb-on-microsoft-windows
https://node-oracledb.readthedocs.io/en/latest/user_guide/initialization.html#enablingthick