JDBC连接Oracle,参数如何正确配置?

99ANYc3cd6
预计阅读时长 21 分钟
位置: 首页 参数 正文

核心连接参数(必须提供)

这些是建立任何连接所必需的基本信息。

jdbc oracle 参数
(图片来源网络,侵删)
参数名 说明 示例值 备注
user 数据库用户名 scott 用于身份验证。
password 数据库密码 tiger 与用户名对应的密码。
url 数据库连接地址 jdbc:oracle:thin:@localhost:1521:ORCL 这是最重要的参数,包含了服务器地址、端口和服务名/SID。

URL 格式详解

jdbc:oracle:thin: 是 Oracle JDBC 驱动的固定标识,后面的地址部分有几种常见的格式:

Thin 模式(最常用)

Thin 模式是纯 Java 实现,无需客户端库,是现代应用的首选。

格式:jdbc:oracle:thin:@<host>:<port>:<service_name_or_sid>

  • <host>: 数据库服务器的 IP 地址或主机名。
    • 示例: localhost, 168.1.100, mydb.example.com
  • <port>: 数据库监听器的端口号,默认为 1521
    • 示例: 1521
  • <service_name_or_sid>: 服务名 或 SID。
    • SID: Oracle 数据库的旧标识符,一个数据库实例只有一个 SID。
      • 示例: ORCL, ORCLCDB
    • Service Name (服务名): Oracle 9i 之后引入的概念,更灵活,一个数据库可以有多个服务名,并且可以跨实例。
      • 示例: ORCLPDB1, sales_db

示例:

jdbc oracle 参数
(图片来源网络,侵删)
// 使用 SID
String url1 = "jdbc:oracle:thin:@localhost:1521:ORCL";
// 使用 Service Name (推荐)
String url2 = "jdbc:oracle:thin:@localhost:1521/ORCLPDB1";

EZConnect 格式(简化版)

这是 Thin 模式的一种简化写法,在 Oracle 10g 及更高版本中推荐使用,语法更清晰。

格式:jdbc:oracle:thin:@//<host>:<port>/<service_name_or_sid>

示例:

// 使用 EZConnect 格式 (推荐)
String url = "jdbc:oracle:thin:@//localhost:1521/ORCLPDB1";

TNSNames 格式

这种方式需要客户端配置 tnsnames.ora 文件,驱动会从该文件中查找连接信息,在配置复杂的网络环境时很有用。

jdbc oracle 参数
(图片来源网络,侵删)

tnsnames.ora 文件示例:

ORCL =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = ORCLPDB1)
    )
  )

Java 代码中的 URL:

String url = "jdbc:oracle:thin:@ORCL";

JDBC 驱动会在客户端的 tnsnames.ora 文件中查找 ORCL 这个条目。


高级连接参数(通过 Properties 对象设置)

这些参数不是必须的,但对于优化连接池性能、处理特定场景非常重要,它们通常作为 java.util.Properties 对象传递给 DriverManager.getConnection() 方法。

参数名 说明 建议值 备注
v$session.program v$session 视图中显示的客户端程序名。 MyJavaApp 非常重要!用于在数据库端识别是哪个应用建立的连接,便于监控和排查问题。
v$session.client_identifier v$session 视图中显示的客户端标识符。 user_123 用于将数据库会话与最终用户或业务逻辑关联起来,便于审计和跟踪。
defaultRowPrefetch 预取的行数。 100 性能关键参数,减少网络往返次数,显著提升查询性能。
includeSynonyms 是否查询包含同义词的表。 false 默认为 false,如果应用需要访问同义词,可以设为 true,但可能会有轻微性能开销。
restrictGetTables 限制 DatabaseMetaData.getTables() 的返回结果。 false 默认为 false,设为 true 可以只返回用户有权限访问的表,减少元数据查询开销。
remarks 是否获取表的备注信息。 true 默认为 false,设为 true 可以获取 COMMENT ON table 的信息。
defaultBatchValue 执行 addBatch() 后的批量提交大小。 20 用于批量插入/更新操作,提升性能。
javax.net.ssl.keyStore 客户端密钥库路径。 /path/to/client.jks 用于 SSL/TLS 加密连接。
javax.net.ssl.keyStorePassword 客户端密钥库密码。 password 配合上述参数使用。

Java 代码示例

下面是一个完整的示例,展示了如何使用上述参数建立连接。

添加 Maven 依赖

确保你的项目中包含了 Oracle JDBC 驱动,推荐使用 Oracle 官方发布的 Maven 仓库。

<!-- pom.xml -->
<dependency>
    <groupId>com.oracle.database.jdbc</groupId>
    <artifactId>ojdbc8</artifactId>
    <version>19.3.0.0</version> <!-- 根据你的 Oracle 数据库版本选择合适的驱动版本 -->
</dependency>

连接代码示例

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;
public class OracleJdbcExample {
    // 数据库连接信息
    private static final String DB_URL = "jdbc:oracle:thin:@//localhost:1521/ORCLPDB1";
    private static final String DB_USER = "scott";
    private static final String DB_PASSWORD = "tiger";
    public static void main(String[] args) {
        // 使用 try-with-resources 确保连接和资源被正确关闭
        try (Connection connection = getOracleConnection()) {
            System.out.println("成功连接到 Oracle 数据库!");
            // 示例:执行一个查询
            String sql = "SELECT * FROM emp WHERE empno = ?";
            try (PreparedStatement pstmt = connection.prepareStatement(sql)) {
                pstmt.setInt(1, 7788); // 查询员工编号为 7788 的员工
                ResultSet rs = pstmt.executeQuery();
                if (rs.next()) {
                    System.out.println("员工姓名: " + rs.getString("ENAME"));
                    System.out.println("员工职位: " + rs.getString("JOB"));
                } else {
                    System.out.println("未找到该员工。");
                }
            }
        } catch (SQLException e) {
            System.err.println("连接数据库失败!");
            e.printStackTrace();
        }
    }
    /**
     * 获取一个带有高级参数的 Oracle 数据库连接
     */
    public static Connection getOracleConnection() throws SQLException {
        // 1. 创建 Properties 对象来存储高级参数
        Properties props = new Properties();
        props.setProperty("user", DB_USER);
        props.setProperty("password", DB_PASSWORD);
        // 2. 设置高级连接参数
        props.setProperty("v$session.program", "MyJavaApp"); // 设置应用名
        props.setProperty("v$session.client_identifier", "user_123"); // 设置客户端标识
        props.setProperty("defaultRowPrefetch", "100"); // 设置预取行数,提升查询性能
        // 3. 使用 DriverManager 获取连接
        // 注意:URL 和 Properties 都需要传递
        return DriverManager.getConnection(DB_URL, props);
    }
}

重要注意事项

  1. 驱动版本务必使用与你的 Oracle 数据库版本兼容或更高的 JDBC 驱动版本,Oracle 19c 数据库最好使用 ojdbc8ojdbc10,使用不兼容的驱动可能会导致功能异常或性能问题。
  2. 连接池:在生产环境中,绝对不要在每次请求时都创建和销毁连接,必须使用连接池(如 HikariCP, DBCP, C3P0)来管理数据库连接,这是提升应用性能和稳定性的关键。
  3. 密码安全:不要将硬编码的密码写在代码中,应使用配置文件、环境变量或密钥管理服务来管理敏感信息。
  4. 字符集:如果应用使用非英文字符(如中文),确保数据库服务器的字符集、客户端环境的字符集(NLS_LANG)和 JDBC 驱动的字符集设置保持一致,以避免乱码问题,在 URL 中可以添加 ?charset=UTF-8 来指定字符集(jdbc:oracle:thin:@//localhost:1521/ORCLPDB1?charset=UTF-8)。
-- 展开阅读全文 --
头像
ASP request 参数如何获取?
« 上一篇 今天
红米Note增强版4G参数亮点有哪些?
下一篇 » 今天

相关文章

取消
微信二维码
支付宝二维码

最近发表

标签列表

目录[+]