首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> JSP 程式設計 >> 關於JSP

JSP連接Oracle最佳實踐:JDBC Thin模式免客戶端部署

     編輯:關於JSP

JSP連接Oracle有OCI(厚驅動)與Thin(純Java)兩種模式。強烈推薦Thin模式:Web服務器無需安裝Oracle Client,僅需ojdbc.jar即可跨平台連接遠程數據庫,部署極簡、避免版本地獄。

環境準備

  1. 從Oracle安裝目錄或官網下載ojdbc8.jar(JDK 8+)或ojdbc11.jar(JDK 11+),放入WEB-INF/lib或容器共享庫。
  2. 配置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數據源,此處僅示例直連邏輯
}

JSP調用示例(業務邏輯應下沉Service層)

<%@ 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) {}
    }
%>

關鍵最佳實踐

  1. PreparedStatement防注入:禁用字符串拼接SQL,參數綁定setXxx()。
  2. 資源反序關閉:ResultSet → Statement → Connection,各自獨立try-catch防止一個關閉失敗阻塞後續。
  3. 連接池化:生產環境絕不直連。配置HikariDataSource(Spring Bootspring.datasource.hikari.*),JNDI查找或注入Service。
  4. URL現代寫法:服務名模式jdbc:oracle:thin:@//host:port/service_name支持RAC負載均衡,優於SID模式。
  5. 驅動版本匹配:ojdbc8配JDK 8/11,ojdbc11配JDK 11/17/21,版本不匹配會報UnsupportedClassVersionError。
  6. 字符集:確保DB、JVM、連接層編碼一致(NLS_LANG、oracle.jdbc.defaultNChar),防中文亂碼。

常見錯誤排查

錯誤原因解決
No suitable driverjar未在類路徑、驅動類名錯誤檢查WEB-INF/lib、Maven依賴、驅動類oracle.jdbc.driver.OracleDriver
ORA-12505SID/服務名錯誤、Listener未註冊該實例lsnrctl status核對、改用服務名URL
ORA-28040認證協議不匹配(12c+默認禁止10g認證)升級驅動、或DB端SQLNET.ALLOWED_LOGON_VERSION_SERVER=8

Thin驅動+連接池+PreparedStatement,是JSP/JDBC連接Oracle的鐵三角標準配置。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved