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

JDBC 連接池與動態 SQL 實戰指南

     編輯:Java 綜合教學

JDBC 連接池與動態 SQL 實戰指南

在 Java 資料庫開發中,合理配置連接池並善用 PreparedStatement 處理動態 SQL,是提升效能與保障安全的關鍵。本文將從配置檔案、連接池封裝、動態 SQL 執行三個維度,詳細解析最佳實踐。

一、屬性配置檔案設計

建議採用 config.properties 外部化配置,包含驅動類別、連線 URL、帳號密碼、最大連線數、最大等待時間等核心參數:

driverClassName=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@host:port:sid
username=your_user
password=your_pass
maxActive=20
maxWait=3000

二、連接池工具類封裝

利用 Apache Commons DBCP 的 BasicDataSource 實現線程安全的連接池管理,靜態區塊初始化時讀取屬性檔並設定參數:

public class DBUtil {
    private static BasicDataSource ds;
    static {
        Properties prop = new Properties();
        try (FileInputStream fis = new FileInputStream("config.properties")) {
            prop.load(fis);
            ds = new BasicDataSource();
            ds.setDriverClassName(prop.getProperty("driverClassName"));
            ds.setUrl(prop.getProperty("url"));
            ds.setUsername(prop.getProperty("username"));
            ds.setPassword(prop.getProperty("password"));
            ds.setMaxActive(Integer.parseInt(prop.getProperty("maxActive")));
            ds.setMaxWait(Long.parseLong(prop.getProperty("maxWait")));
        } catch (IOException e) {
            throw new ExceptionInInitializerError(e);
        }
    }
    public static Connection getConnection() throws SQLException {
        return ds.getConnection();
    }
    public static void closeConnection(Connection conn) {
        if (conn != null) try { conn.close(); } catch (SQLException ignored) {}
    }
}

三、PreparedStatement 防注入與效能優化

動態 SQL 使用佔位符 ? 實現預編譯,杜絕 SQL 注入風險,並讓資料庫重用執行計畫:

String sql = "INSERT INTO userinfo (id, username, password, email, nickname, account) "
           + "VALUES (seq_userinfo_id.NEXTVAL, ?, ?, ?, ?, ?)";
try (Connection conn = DBUtil.getConnection();
     PreparedStatement ps = conn.prepareStatement(sql)) {
    ps.setString(1, "liucan");
    ps.setString(2, "123456");
    ps.setString(3, "liu@qq.com");
    ps.setString(4, "hello");
    ps.setDouble(5, 5000.0);
    int rows = ps.executeUpdate();
    System.out.println(rows > 0 ? "插入成功!" : "插入失敗");
} catch (SQLException e) {
    e.printStackTrace();
}

核心優勢: 1) 語義確定後不再改變,免疫注入攻擊;2) 批量操作時重用執行計畫,大幅降低資料庫負載。

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