在Linux环境下,Java程序连接Oracle数据库是企业级开发中的常见需求,需完成环境准备、驱动配置、代码编写及问题排查等步骤,下面详细介绍具体流程。
环境准备
首先需确保Linux系统、Java开发环境及Oracle数据库正常运行,推荐使用CentOS 7+或Ubuntu 18.04+系统,安装JDK 1.8/11/17(需与Oracle JDBC驱动版本匹配),并确认Oracle数据库(11g/12c/19c/21c)已启动监听服务,可通过命令检查:
- 查看JDK版本:
java -version
- 检查Oracle监听状态:
lsnrctl status
,若未启动则执行lsnrctl start
JDBC驱动配置
Oracle JDBC驱动是Java连接数据库的核心组件,需根据数据库版本和JDK版本选择对应驱动(如ojdbc8.jar、ojdbc11.jar),可通过Oracle官网下载,或使用Maven/Gradle管理依赖。
Maven依赖配置(以ojdbc8为例):
<dependency> <groupId>com.oracle.database.jdbc</groupId> <artifactId>ojdbc8</artifactId> <version>19.3.0.0</version> <!-- 需匹配Oracle数据库版本 --> </dependency>
若为非Maven项目,需手动下载驱动jar包,并将其置于项目lib
目录,编译时通过-cp
参数指定路径:
javac -cp ./lib/ojdbc8.jar:. YourClass.java
Java代码实现
连接Oracle的核心步骤包括加载驱动、获取连接、执行SQL及释放资源,以下为完整示例代码:
import java.sql.*; public class OracleConnTest { public static void main(String[] args) { // 连接字符串格式:jdbc:oracle:thin:@//主机:端口/服务名 String url = "jdbc:oracle:thin:@//192.168.1.100:1521/orcl"; String user = "scott"; String password = "tiger"; try (Connection conn = DriverManager.getConnection(url, user, password); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM emp WHERE rownum <= 5")) { System.out.println("EMPNOtENAME"); while (rs.next()) { System.out.println(rs.getInt("EMPNO") + "t" + rs.getString("ENAME")); } } catch (SQLException e) { System.err.println("连接失败: " + e.getMessage()); e.printStackTrace(); } } }
说明:
- 连接字符串中表示TCP直连,避免依赖本地
tnsnames.ora
文件; - 使用
try-with-resources
自动关闭Connection
、Statement
、ResultSet
,防止资源泄漏; - 服务名(Service Name)和SID(系统标识符)需根据Oracle数据库配置选择,可通过
sqlplus / as sysdba
执行SELECT instance_name FROM v$instance
查看SID,或SELECT value FROM v$parameter WHERE name = 'service_names'
查看服务名。
常见问题排查
ClassNotFoundException
:驱动jar包未加入classpath,或Maven依赖未下载成功,检查项目lib
目录是否存在驱动jar,或执行mvn clean install
更新依赖。IO异常:Network Adapter unable to establish connection
:- 检查防火墙是否开放1521端口(
firewall-cmd --list-ports
确认); - 确认Oracle监听是否启动(
lsnrctl status
),若未启动则执行lsnrctl start
; - 验证主机名/IP是否正确,可通过
telnet 目标IP 1521
测试网络连通性。
- 检查防火墙是否开放1521端口(
ORA-01017: invalid username/password
:确认数据库用户名、密码是否正确,以及用户是否有远程连接权限(GRANT CONNECT TO scott
)。
Oracle数据库版本与JDBC驱动对应表
Oracle数据库版本 | 推荐JDBC驱动版本 | 适用JDK版本 |
---|---|---|
11g R2 | ojdbc6.jar/ojdbc8.jar | 6/1.8 |
12c R1/R2 | ojdbc8.jar | 8+ |
19c/21c | ojdbc11.jar | 11+ |
连接字符串格式示例
场景 | 连接字符串格式 | 说明 |
---|---|---|
使用服务名(推荐) | jdbc:oracle:thin:@//主机:端口/服务名 | 适用于Oracle 10g及以上,无需本地配置 |
使用SID | jdbc:oracle:thin:@主机:端口:SID | 适用于旧版Oracle(如9i) |
FAQs
Q1: Linux下连接Oracle时提示“ORA-12514: TNS:监听程序当前无法识别连接描述符中请求的服务”,如何解决?
A: 该错误通常因服务名/SID配置错误或监听未注册服务导致,检查tnsnames.ora
文件中的服务名是否与数据库实例名一致,或执行lsnrctl services
查看监听器注册的服务列表,若使用动态注册(默认),确保数据库实例已启动(sqlplus / as sysdba
执行startup
)。
Q2: Java程序在Linux服务器上运行正常,但在其他Linux服务器上连接Oracle超时,可能的原因是什么?
A: 可能原因包括:(1)目标服务器防火墙未开放1521端口,需执行firewall-cmd --add-port=1521/tcp --permanent
并重载;(2)网络路由问题,使用traceroute 目标IP
检查网络路径;(3)Oracle监听绑定IP为127.0.0.1,需修改$ORACLE_HOME/network/admin/listener.ora
,将HOST = localhost
改为HOST = 0.0.0.0
并重启监听。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/32818.html