JSP連接Oracle有OCI(厚驅動)與Thin(純Java)兩種模式。強烈推薦Thin模式:Web服務器無需安裝Oracle Client,僅需ojdbc.jar即可跨平台連接遠程數據庫,部署極簡、避免版本地獄。
ojdbc8.jar(JDK 8+)或ojdbc11.jar(JDK 11+),放入WEB-INF/lib或容器共享庫。CLASSPATH包含該jar(現代構建工具Maven/Gradle自動管理,無需手動配置環境變量)。package com.example.dao;
import java.sql.*;
public class OracleConnector {
private static final String DRIVER = "oracle.jdbc.driver.OracleDriver";
private static final String URL_TEMPLATE = "jdbc:oracle:thin:@%s:%d:%s"; // host:port:SID
// 服務名模式:jdbc:oracle:thin:@//host:port/service_name
public static Connection getConnection(String host, int port, String sid,
String user, String password) throws SQLException {
try {
Class.forName(DRIVER).newInstance(); // JDBC 4.0+可省略,驅動自動註冊
} catch (Exception e) {
throw new SQLException("Driver load failed", e);
}
String url = String.format(URL_TEMPLATE, host, port, sid);
return DriverManager.getConnection(url, user, password);
}
// 生產環境建議:使用HikariCP數據源,此處僅示例直連邏輯
}
<%@ page import="java.sql.*, com.example.dao.OracleConnector" %>
<%
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
conn = OracleConnector.getConnection("192.168.96.1", 1521, "oracle9i", "scott", "tiger");
String sql = "SELECT empno, ename, sal FROM emp WHERE deptno = ?";
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, 10);
rs = pstmt.executeQuery();
%>
<table border="1">
<tr><th>工號</th><th>姓名</th><th>薪資</th></tr>
<%
while (rs.next()) {
%>
<tr>
<td><%= rs.getInt("empno") %></td>
<td><%= rs.getString("ename") %></td>
<td><%= rs.getDouble("sal") %></td>
</tr>
<%
}
%>
</table>
<%
} catch (SQLException e) {
e.printStackTrace();
out.println("查詢失敗: " + e.getMessage());
} finally {
try { if (rs != null) rs.close(); } catch (SQLException ignored) {}
try { if (pstmt != null) pstmt.close(); } catch (SQLException ignored) {}
try { if (conn != null) conn.close(); } catch (SQLException ignored) {}
}
%>
setXxx()。try-catch防止一個關閉失敗阻塞後續。HikariDataSource(Spring Bootspring.datasource.hikari.*),JNDI查找或注入Service。jdbc:oracle:thin:@//host:port/service_name支持RAC負載均衡,優於SID模式。ojdbc8配JDK 8/11,ojdbc11配JDK 11/17/21,版本不匹配會報UnsupportedClassVersionError。NLS_LANG、oracle.jdbc.defaultNChar),防中文亂碼。| 錯誤 | 原因 | 解決 |
|---|---|---|
No suitable driver | jar未在類路徑、驅動類名錯誤 | 檢查WEB-INF/lib、Maven依賴、驅動類oracle.jdbc.driver.OracleDriver |
ORA-12505 | SID/服務名錯誤、Listener未註冊該實例 | lsnrctl status核對、改用服務名URL |
ORA-28040 | 認證協議不匹配(12c+默認禁止10g認證) | 升級驅動、或DB端SQLNET.ALLOWED_LOGON_VERSION_SERVER=8 |
Thin驅動+連接池+PreparedStatement,是JSP/JDBC連接Oracle的鐵三角標準配置。