Skip to content

Oracle 驱动程序配置

OCI (Oracle Call Interface) 驱动

概述

OCI是Oracle提供的原生C语言接口,用于开发高性能的Oracle应用程序。

安装与配置

Windows 环境

  1. 下载并安装 Oracle Instant Client
  2. 配置环境变量:
    • ORACLE_HOME:指向Instant Client目录
    • PATH:添加Instant Client目录
    • TNS_ADMIN:指向tnsnames.ora文件所在目录(可选)

Linux 环境

  1. 下载并解压 Oracle Instant Client
  2. 配置环境变量:
    bash
    export ORACLE_HOME=/path/to/instantclient
    export LD_LIBRARY_PATH=$ORACLE_HOME:$LD_LIBRARY_PATH
    export PATH=$ORACLE_HOME:$PATH
    export TNS_ADMIN=$ORACLE_HOME/network/admin  # 可选
  3. 可选:创建符号链接以确保应用程序能找到正确的库版本
    bash
    cd $ORACLE_HOME
    ln -s libclntsh.so.19.1 libclntsh.so

tnsnames.ora 配置

ORCL = 
  (DESCRIPTION = 
    (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    (CONNECT_DATA = 
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl.example.com)
    )
  )

ORCL_RAC = 
  (DESCRIPTION = 
    (ADDRESS_LIST = 
      (ADDRESS = (PROTOCOL = TCP)(HOST = rac-node1)(PORT = 1521))
      (ADDRESS = (PROTOCOL = TCP)(HOST = rac-node2)(PORT = 1521))
    )
    (CONNECT_DATA = 
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl_rac.example.com)
      (FAILOVER_MODE = 
        (TYPE = SELECT)
        (METHOD = BASIC)
        (RETRIES = 180)
        (DELAY = 5)
      )
    )
  )

JDBC 驱动

概述

JDBC是Java应用程序访问Oracle数据库的标准接口。

驱动类型

  1. JDBC Thin Driver:纯Java驱动,不需要Oracle客户端
  2. JDBC OCI Driver:基于OCI的驱动,需要Oracle客户端
  3. JDBC RAC Driver:针对RAC环境优化的驱动

配置与使用

Maven 依赖

xml
<!-- Oracle JDBC 驱动 -->
<dependency>
    <groupId>com.oracle.database.jdbc</groupId>
    <artifactId>ojdbc11</artifactId>
    <version>23.3.0.23.09</version>
</dependency>

<!-- 可选:Oracle UCP 连接池 -->
<dependency>
    <groupId>com.oracle.database.jdbc</groupId>
    <artifactId>ucp</artifactId>
    <version>23.3.0.23.09</version>
</dependency>

连接字符串格式

java
// Thin 驱动连接字符串
String url = "jdbc:oracle:thin:@hostname:port:service_name";
String url = "jdbc:oracle:thin:@//hostname:port/service_name";
String url = "jdbc:oracle:thin:@tns_alias";

// 带TNS描述符的连接字符串
String url = "jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=hostname)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=service_name)))";

示例代码

java
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class JdbcExample {
    public static void main(String[] args) {
        try {
            // 加载驱动(Java 6+ 自动加载)
            // Class.forName("oracle.jdbc.OracleDriver");
            
            // 建立连接
            String url = "jdbc:oracle:thin:@localhost:1521:orcl";
            String username = "scott";
            String password = "tiger";
            Connection conn = DriverManager.getConnection(url, username, password);
            
            // 执行查询
            Statement stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery("SELECT * FROM employees");
            
            // 处理结果
            while (rs.next()) {
                System.out.println(rs.getString("first_name") + " " + rs.getString("last_name"));
            }
            
            // 关闭资源
            rs.close();
            stmt.close();
            conn.close();
            
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

UCP 连接池配置

java
import oracle.ucp.jdbc.PoolDataSource;
import oracle.ucp.jdbc.PoolDataSourceFactory;

public class UcpExample {
    public static void main(String[] args) {
        try {
            // 创建连接池数据源
            PoolDataSource pds = PoolDataSourceFactory.getPoolDataSource();
            
            // 配置连接池
            pds.setConnectionFactoryClassName("oracle.jdbc.pool.OracleDataSource");
            pds.setURL("jdbc:oracle:thin:@localhost:1521:orcl");
            pds.setUser("scott");
            pds.setPassword("tiger");
            
            // 配置连接池属性
            pds.setInitialPoolSize(5);
            pds.setMinPoolSize(5);
            pds.setMaxPoolSize(20);
            pds.setConnectionWaitTimeout(30);
            
            // 从连接池获取连接
            Connection conn = pds.getConnection();
            
            // 使用连接...
            
            // 归还连接到连接池
            conn.close();
            
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

ODBC 驱动

概述

ODBC是一种标准的数据库访问接口,允许应用程序通过ODBC驱动访问各种数据库。

安装与配置

Windows 环境

  1. 下载并安装 Oracle ODBC 驱动(包含在Oracle Client或Instant Client中)
  2. 配置ODBC数据源:
    • 打开 "ODBC 数据源管理器"
    • 选择 "系统 DSN" 或 "用户 DSN"
    • 点击 "添加",选择 Oracle ODBC 驱动
    • 配置数据源名称、TNS服务名、用户名等

Linux 环境

  1. 安装 unixODBC 和 Oracle ODBC 驱动
  2. 配置 /etc/odbc.ini 文件:
    ini
    [ORCL]
    Description = Oracle ODBC Connection
    Driver = Oracle-instantclient19.12
    ServerName = localhost:1521/orcl
    UserID = scott
    Password = tiger
  3. 配置 /etc/odbcinst.ini 文件:
    ini
    [Oracle-instantclient19.12]
    Description = Oracle ODBC driver for Oracle 19c
    Driver = /path/to/instantclient/libsqora.so.19.1
    Setup = 
    FileUsage = 
    CPTimeout = 
    CPReuse =

示例代码

C# 示例

csharp
using System.Data.Odbc;

class OdbcExample {
    static void Main() {
        string connectionString = "DSN=ORCL;Uid=scott;Pwd=tiger;";
        
        using (OdbcConnection conn = new OdbcConnection(connectionString)) {
            conn.Open();
            
            string sql = "SELECT first_name, last_name FROM employees";
            using (OdbcCommand cmd = new OdbcCommand(sql, conn)) {
                using (OdbcDataReader reader = cmd.ExecuteReader()) {
                    while (reader.Read()) {
                        Console.WriteLine($"{reader["first_name"]} {reader["last_name"]}");
                    }
                }
            }
        }
    }
}

Node.js 驱动

概述

Node.js应用程序可以通过多种驱动访问Oracle数据库,常用的有oracledb驱动。

安装与配置

  1. 安装 Node.js 和 npm
  2. 安装 oracledb 驱动:
    bash
    npm install oracledb
  3. 确保Oracle Instant Client已安装并配置正确

示例代码

javascript
const oracledb = require('oracledb');

async function run() {
    let connection;
    
    try {
        // 建立连接
        connection = await oracledb.getConnection({
            user: "scott",
            password: "tiger",
            connectionString: "localhost:1521/orcl"
        });
        
        // 执行查询
        const result = await connection.execute(
            `SELECT first_name, last_name 
             FROM employees 
             WHERE department_id = :did`,
            [10]  // 绑定参数
        );
        
        // 处理结果
        console.log("查询结果:");
        result.rows.forEach(row => {
            console.log(row[0], row[1]);
        });
        
    } catch (err) {
        console.error(err);
    } finally {
        if (connection) {
            try {
                await connection.close();
            } catch (err) {
                console.error(err);
            }
        }
    }
}

run();

连接池配置

javascript
const oracledb = require('oracledb');

async function init() {
    try {
        // 配置连接池
        await oracledb.createPool({
            user: "scott",
            password: "tiger",
            connectionString: "localhost:1521/orcl",
            poolMin: 2,
            poolMax: 10,
            poolIncrement: 1
        });
        console.log("连接池已创建");
    } catch (err) {
        console.error("创建连接池失败:", err);
    }
}

async function query() {
    let connection;
    
    try {
        // 从连接池获取连接
        connection = await oracledb.getConnection();
        
        // 执行查询...
        
    } catch (err) {
        console.error(err);
    } finally {
        if (connection) {
            try {
                await connection.close(); // 归还连接到连接池
            } catch (err) {
                console.error(err);
            }
        }
    }
}

init();

Python 驱动

概述

Python应用程序可以通过cx_Oracle驱动访问Oracle数据库。

安装与配置

  1. 安装 Python 和 pip
  2. 安装 cx_Oracle 驱动:
    bash
    pip install cx_Oracle
  3. 确保Oracle Instant Client已安装并配置正确

示例代码

python
import cx_Oracle

# 建立连接
connection = cx_Oracle.connect(
    user="scott",
    password="tiger",
    dsn="localhost:1521/orcl"
)

# 创建游标
cursor = connection.cursor()

# 执行查询
cursor.execute("SELECT first_name, last_name FROM employees WHERE department_id = :did", [10])

# 处理结果
print("查询结果:")
for row in cursor:
    print(row[0], row[1])

# 关闭游标和连接
cursor.close()
connection.close()

连接池配置

python
import cx_Oracle

# 创建连接池
pool = cx_Oracle.SessionPool(
    user="scott",
    password="tiger",
    dsn="localhost:1521/orcl",
    min=2,
    max=10,
    increment=1
)

# 从连接池获取连接
connection = pool.acquire()

# 创建游标并执行查询
cursor = connection.cursor()
cursor.execute("SELECT * FROM departments")

# 处理结果...

# 归还连接到连接池
pool.release(connection)

# 关闭连接池(可选)
pool.close()

.NET 驱动

概述

Oracle Data Provider for .NET (ODP.NET) 是Oracle提供的用于.NET应用程序访问Oracle数据库的驱动。

安装与配置

NuGet 安装

bash
# ODP.NET Core
Install-Package Oracle.ManagedDataAccess.Core

# ODP.NET Framework
Install-Package Oracle.ManagedDataAccess

示例代码

.NET Core 示例

csharp
using Oracle.ManagedDataAccess.Client;

class OracleExample {
    static void Main() {
        string connectionString = "User Id=scott;Password=tiger;Data Source=localhost:1521/orcl;";
        
        using (OracleConnection conn = new OracleConnection(connectionString)) {
            conn.Open();
            
            string sql = "SELECT first_name, last_name FROM employees WHERE department_id = :did";
            using (OracleCommand cmd = new OracleCommand(sql, conn)) {
                cmd.Parameters.Add(new OracleParameter("did", 10));
                
                using (OracleDataReader reader = cmd.ExecuteReader()) {
                    while (reader.Read()) {
                        Console.WriteLine($"{reader["first_name"]} {reader["last_name"]}");
                    }
                }
            }
        }
    }
}

版本差异

Oracle 11g

  • 支持 OCI 11g
  • 支持 JDBC 6/7
  • 支持 .NET Framework 驱动
  • 有限的 Node.js 和 Python 驱动支持

Oracle 12c

  • 支持 OCI 12c
  • 支持 JDBC 7/8
  • 引入 ODP.NET Managed Driver
  • 增强了 Node.js 和 Python 驱动支持

Oracle 19c

  • 支持 OCI 19c
  • 支持 JDBC 10/11
  • 增强了 .NET Core 支持
  • 改进了 Node.js 和 Python 驱动性能

Oracle 21c

  • 支持 OCI 21c
  • 支持 JDBC 11
  • 增强了云环境下的驱动支持
  • 改进了各种驱动的安全性

常见问题

Q: 如何测试驱动连接是否正常?

A: 使用简单的测试脚本连接数据库并执行基本查询,如 SELECT 1 FROM dual;

Q: 遇到 "ORA-12154: TNS:could not resolve the connect identifier specified" 错误怎么办?

A: 检查 TNS 配置,确保 tnsnames.ora 文件存在且配置正确,TNS_ADMIN 环境变量设置正确。

Q: 遇到 "DPI-1047: Cannot locate a 64-bit Oracle Client library" 错误怎么办?

A: 安装 64 位 Oracle Instant Client,并确保环境变量配置正确。

Q: 如何提高驱动性能?

A: 使用连接池,优化 SQL 语句,使用绑定变量,调整驱动参数,确保驱动版本与 Oracle 数据库版本兼容。

Q: 如何配置驱动的连接超时?

A: 不同驱动有不同的配置方式,例如:

  • JDBC: oracle.net.CONNECT_TIMEOUT 属性
  • Node.js: connectTimeout 选项
  • Python: timeout 参数

Q: 如何处理驱动的字符集问题?

A: 确保客户端字符集与数据库字符集兼容,配置环境变量 NLS_LANG,例如:NLS_LANG=AMERICAN_AMERICA.AL32UTF8

Q: 如何升级驱动?

A: 下载最新版本的驱动,更新应用程序的依赖,测试兼容性,逐步部署到生产环境。

Q: 如何配置驱动的 SSL/TLS 连接?

A: 配置驱动的 SSL 选项,确保 Oracle 数据库已启用 SSL,提供必要的证书文件。

Q: 如何监控驱动的连接使用情况?

A: 使用驱动提供的监控功能,如 JDBC 的 v$session 视图,或应用程序级别的监控。

Q: 如何处理驱动的内存泄漏问题?

A: 确保正确关闭连接、游标和其他资源,使用连接池,定期升级驱动到最新版本。