核心连接参数
这些是建立连接最基本、最核心的参数。

(图片来源网络,侵删)
| 参数 | 描述 | 示例 | 备注 |
|---|---|---|---|
user |
数据库用户名 | user=scott |
必需参数。 |
password |
数据库密码 | password=tiger |
必需参数。 |
database |
数据库服务名 (Oracle 10g 及以后推荐) | database=ORCLPDB1 |
如果使用服务名,这是推荐方式。 |
sid |
数据库系统标识符 (Oracle 9i 及以前常用) | sid=ORCL |
在较新的 Oracle 版本中,服务名 (database) 是更现代和推荐的做法。 |
server |
服务器地址 | server=192.168.1.100 |
数据库服务器的 IP 地址或主机名。 |
port |
监听端口 | port=1521 |
Oracle 数据库的默认端口。 |
高级连接参数 (性能与行为)
这些参数用于优化连接池行为、控制会话属性和提升性能。
| 参数 | 描述 | 示例 | 备注 |
|---|---|---|---|
defaultRowPrefetch |
默认的行预取大小 | defaultRowPrefetch=100 |
非常重要的性能参数,当查询返回多行时,驱动程序会从服务器一次性预取指定数量的行到客户端,减少网络往返次数,显著提升查询性能,默认值通常是 10。 |
includeSynonyms |
是否包含同义词 | includeSynonyms=true |
默认为 false,设置为 true 时,查询会考虑用户同义词,可能影响性能和查询结果。 |
restrictGetTables |
限制 DatabaseMetaData.getTables() 的返回结果 |
restrictGetTables=true |
默认为 false,设置为 true 时,getTables() 只返回用户拥有权限的表,不包含其他用户的表,可以提升元数据查询速度。 |
remarksReporting |
是否在数据库元数据中包含备注 | remarksReporting=true |
默认为 false,设置为 true 时,表和列的备注信息会包含在元数据中。 |
defaultExecuteBatch |
默认的批量执行大小 | defaultExecuteBatch=20 |
用于 PreparedStatement 的 addBatch() 和 executeBatch() 操作,设置一个合适的值可以显著提高批量插入/更新的性能。 |
SSL/TLS 安全参数
当需要通过加密连接来保护数据安全时使用。
| 参数 | 描述 | 示例 | 备注 |
|---|---|---|---|
ssl |
是否启用 SSL/TLS 加密 | ssl=true |
必须设置为 true 以启用加密。 |
ssl_server_dn_match |
是否验证服务器证书中的主题名称 | ssl_server_dn_match=true |
强烈推荐启用,用于防止中间人攻击,确保你连接的是预期的服务器。 |
trustStore |
信任库文件的路径 | trustStore=/path/to/client_truststore.jks |
存储受信任的 CA 证书。 |
trustStorePassword |
信任库的密码 | trustStorePassword=changeit |
|
keyStore |
密钥库文件的路径 (如果客户端需要认证) | keyStore=/path/to/client_keystore.jks |
|
keyStorePassword |
密钥库的密码 | keyStorePassword=changeit |
连接池与超时参数
这些参数在连接池环境中尤其重要,用于管理连接的生命周期。
| 参数 | 描述 | 示例 | 备注 |
|---|---|---|---|
connectTimeout |
连接超时时间 (毫秒) | connectTimeout=3000 |
驱动程序尝试建立连接的最长时间,如果超时,抛出 SQLException。 |
loginTimeout |
登录超时时间 (秒) | loginTimeout=10 |
DriverManager 尝试获取连接的最长时间,与 connectTimeout 不同,loginTimeout 是全局的,作用于所有驱动程序。 |
socketTimeout |
(或 readTimeout) 网络读取超时时间 (毫秒) |
socketTimeout=30000 |
在执行查询或读取数据时,如果指定时间内没有数据传输,连接将超时,防止因网络问题或数据库挂起导致的无限等待。 |
驱动程序行为与诊断参数
用于调试或改变驱动程序的默认行为。

(图片来源网络,侵删)
| 参数 | 描述 | 示例 | 备注 |
|---|---|---|---|
v$session.program |
设置 V$SESSION 视图中 PROGRAM 列的值 |
v$session.program=MyJavaApp |
用于在数据库端标识连接来源,便于监控和管理。 |
v$session.machine |
设置 V$SESSION 视图中 MACHINE 列的值 |
v$session.machine=web-server-01 |
通常设置为客户端的机器名或 IP 地址。 |
v$session.terminal |
设置 V$SESSION 视图中 TERMINAL 列的值 |
v$session.terminal=MY_DESKTOP |
|
logWriter |
设置日志输出流 | logWriter=System.out |
将 JDBC 驱动程序的日志信息输出到标准输出,用于调试。 |
logLevel |
设置日志级别 | logLevel=FINE |
日志级别 (如 SEVERE, WARNING, INFO, CONFIG, FINE, FINER, FINEST)。 |
Thin vs. OCI 驱动
在配置参数前,首先要确定你使用的是哪种驱动。
| 特性 | Thin Driver (瘦驱动) | OCI Driver (Oracle Call Interface) |
|---|---|---|
| 实现 | 纯 Java 实现,无需 Oracle 客户端库。 | 使用 C 语言实现,需要安装 Oracle 客户端或 Oracle Instant Client。 |
| 依赖 | 只需 JDBC JAR 文件 (ojdbcX.jar)。 |
需要 Oracle 客户端库 (ociXX.dll / libocci.so)。 |
| 性能 | 性能略低于 OCI,因为所有网络通信都由 Java 处理。 | 性能更高,因为它直接调用操作系统级别的本地 API,网络通信更高效。 |
| 功能 | 功能齐全,但不支持所有高级特性(如 TAF - Transparent Application Failover)。 | 支持更多高级特性,如 TAF、外部认证、高级数据类型等。 |
| 部署 | 部署简单,跨平台,适合 AppServer、WebLogic、Tomcat 等 Java 应用服务器。 | 部署复杂,需要在应用服务器所在机器上安装 Oracle 客户端。 |
| URL 格式 | jdbc:oracle:thin:@<host>:<port>:<service_name_or_sid> |
jdbc:oracle:oci:@<connect_descriptor> |
如何选择?
- 绝大多数场景:优先选择 Thin 驱动,因为它简单、易部署、跨平台,性能已经足够好。
- 需要高级特性或极致性能:如果应用需要 TAF、或运行在需要与 Oracle 紧密集成的环境中,可以考虑 OCI 驱动。
URL 格式示例
使用 Thin 驱动 (推荐)
// 使用服务名 (Service Name) String url_thin_service = "jdbc:oracle:thin:@//192.168.1.100:1521/ORCLPDB1"; // 使用 SID (System ID) String url_thin_sid = "jdbc:oracle:thin:@192.168.1.100:1521:ORCL";
使用 OCI 驱动
// 使用简单连接字符串 String url_oci_simple = "jdbc:oracle:oci:@ORCL"; // 使用 TNS 连接描述符 (更灵活) String url_oci_tns = "jdbc:oracle:oci:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.100)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ORCLPDB1)))";
完整代码示例 (使用 Thin 驱动和 Properties)
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 {
public static void main(String[] args) {
// 数据库连接信息
String dbUrl = "jdbc:oracle:thin:@//my-oracle-db-host:1521/ORCLPDB1";
// 使用 Properties 对象来设置参数,比在 URL 中拼接更清晰
Properties props = new Properties();
props.setProperty("user", "scott");
props.setProperty("password", "tiger");
// --- 高级参数 ---
// 设置行预取为 200,提升查询性能
props.setProperty("defaultRowPrefetch", "200");
// 启用 SSL
props.setProperty("ssl", "true");
// 强制验证服务器证书
props.setProperty("ssl_server_dn_match", "true");
// 设置连接超时为 5 秒
props.setProperty("connectTimeout", "5000");
// 设置网络读取超时为 30 秒
props.setProperty("socketTimeout", "30000");
// 设置 V$SESSION 中的程序名
props.setProperty("v$session.program", "MyJavaApplication/1.0");
// 设置 V$SESSION 中的机器名
props.setProperty("v$session.machine", "app-server-01");
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
// 1. 加载驱动 (JDBC 4.0+ 后可省略此步)
// Class.forName("oracle.jdbc.OracleDriver");
// 2. 获取连接
System.out.println("正在尝试连接到 Oracle 数据库...");
conn = DriverManager.getConnection(dbUrl, props);
System.out.println("连接成功!");
// 3. 创建查询语句
String sql = "SELECT ename, job, sal FROM emp WHERE deptno = ?";
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, 20); // 设置参数
// 4. 执行查询
rs = pstmt.executeQuery();
// 5. 处理结果集
System.out.println("\n--- 查询结果 (部门 20 的员工) ---");
while (rs.next()) {
String name = rs.getString("ename");
String job = rs.getString("job");
double salary = rs.getDouble("sal");
System.out.printf("姓名: %s, 职位: %s, 薪资: %.2f%n", name, job, salary);
}
} catch (SQLException e) {
System.err.println("数据库操作出错!");
e.printStackTrace();
} finally {
// 6. 关闭资源 (遵循后开先关的原则)
try {
if (rs != null) rs.close();
if (pstmt != null) pstmt.close();
if (conn != null) conn.close();
System.out.println("\n数据库连接已关闭。");
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
最佳实践总结
- 首选 Thin 驱动:除非有特殊需求(如 TAF),否则优先使用 Thin 驱动。
- 使用
Properties对象:将所有连接参数放在Properties对象中,而不是拼接到 URL 字符串里,这样代码更清晰、更易于维护。 - 设置
defaultRowPrefetch:对于查询密集型应用,务必设置一个合适的行预取值(如 100 或 200),这是提升 JDBC 查询性能最有效的方法之一。 - 启用超时:必须设置
connectTimeout和socketTimeout,以防止应用程序因网络问题或数据库无响应而永久挂起。 - 使用连接池:在生产环境中,绝对不要直接使用
DriverManager来管理连接,务必使用连接池,如 HikariCP、Druid、WebLogic DataSource 等,连接池会复用连接,并提供更完善的超时、验证和管理机制,上面的Properties参数可以直接配置到连接池的配置中。 - 关注安全性:如果连接在不可信的网络中传输,请务必启用 SSL/TLS 加密。

(图片来源网络,侵删)
