資料庫連線管理

2026-03-09 Oracle

程式語言連線方式比對: Java VS .NET

設定類別 設定名稱 設定說明 Java 參數名稱 (YAML) .Net (ODP.NET) 參數名稱
基礎配置 資料庫方言 告知 ORM 框架底層是哪種資料庫,以產生對應的 SQL。 dialect (無直接對應,ODP.NET 為 Oracle 專用原生驅動)
基礎配置 記錄 SQL 是否在 Console 或日誌中印出執行的 SQL 語法。 logSql (無直接對應,通常透過 .NET ORM 或 Oracle Trace 設定)
基礎配置 連線字串 指定要連線的資料庫 IP、Port 與 Service Name。 url Data Source
連線池開關 啟用連線池 是否啟用連線池機制來重複利用實體連線。 pooled Pooling
容量控制 初始連線數 連線池剛啟動時,預先建立的連線數量。 initialSize Min Pool Size (啟動時即盡量滿足此數量)
容量控制 最小閒置連線 連線池常態維持的最小連線數,減少突發流量的建立成本。 minIdle / minimumIdle Min Pool Size
容量控制 最大活動連線 整個連線池允許擴張到的極限總數,保護 DB 不被撐爆。 maxActive / maximumPoolSize Max Pool Size
容量控制 最大閒置連線 允許處於閒置狀態的最大連線數,超過此數的閒置連線會被釋放。 maxIdle (由 Min Pool Size 與 Decr 步進機制控制)
擴縮機制 連線增量 當連線不夠用時,一次額外建立的連線數量步進值。 (框架通常預設為 1,逐一增加) Incr Pool Size
擴縮機制 連線減量 當回收閒置連線時,一次關閉的連線數量步進值。 (框架通常由驅逐執行緒逐一回收) Decr Pool Size
生命週期 連線等待逾時 當池中無可用連線時,應用程式等待獲取連線的極限時間(毫秒/秒)。 maxWait / connectionTimeout Connection Timeout (預設單位為秒)
生命週期 最大存活時間 強制關閉並重建連線的時間上限,對於 RAC 環境的負載重新分配極為重要。 maxAge / maxLifetime Connection Lifetime (預設單位為秒)
生命週期 閒置回收時間 連線閒置超過此時間後,將被標記為可回收。 minEvictableIdleTimeMillis / idleTimeout (ODP.NET 每 3 分鐘自動執行一次閒置評估,無對應參數)
驅逐執行緒 驅逐檢查間隔 背景執行緒每隔多久醒來檢查一次是否有超時的閒置連線。 timeBetweenEvictionRunsMillis (由 ODP.NET 底層自動排程,無對應參數)
驅逐執行緒 每次檢查數量 每次背景執行緒醒來時,要檢查多少個連線。 numTestsPerEvictionRun (由 ODP.NET 內部演算法決定,無對應參數)
有效性驗證 借用前驗證 在從連線池取出連線前,先測試其是否存活(應對 RAC 節點偏移)。 testOnBorrow Validate Connection
有效性驗證 閒置時驗證 驅逐執行緒在檢查閒置連線時,是否順便測試其存活狀態。 testWhileIdle HA Events (ODP.NET 依賴 HA Events 即時剔除死連線)
有效性驗證 歸還前驗證 將連線放回連線池之前,測試其是否存活。 testOnReturn (無直接對應參數)
有效性驗證 驗證語法 用來測試連線是否存活的 SQL 語法。 validationQuery (例如 SELECT 1) (ODP.NET 原生支援 Ping DB,無需指定 SQL)
有效性驗證 驗證逾時 驗證語法執行的極限時間。 validationQueryTimeout (包含在整體的 Connection Timeout 中)
有效性驗證 驗證間隔限制 避免過度頻繁驗證,定義兩次驗證之間的最短間隔。 validationInterval (無直接對應參數)
進階與監控 JMX 監控啟用 是否將連線池的狀態(如活躍數、閒置數)註冊到 Java JMX 以便工具監控。 jmxEnabled .NET 通常使用 Performance Counters 監控
進階與監控 JDBC 攔截器 註冊攔截器以捕捉連線狀態或 SQL 執行過程(如 ConnectionState)。 jdbcInterceptors (無直接對應,需透過 .NET 的 DbCommandInterceptor 實作)
交易與效能 預設交易隔離 設定連線的預設隔離層級(如 Read Committed)。 defaultTransactionIsolation (通常透過 .NET TransactionScope 或程式碼指定)
交易與效能 環境交易控制 決定連線是否自動加入 .NET 的分散式/環境交易(TransactionScope)。 (Java 透過 JTA/XA 另行控制) Enlist
交易與效能 語法快取 快取常執行的 SQL 語法,降低 DB 重新 Parsing 的負擔。 (Java 通常在 JDBC URL 中設定 statementCacheSize) Statement Cache Size
RAC 專屬 高可用性事件 接收 RAC DB 發出的節點開關機或故障事件(FAN Events),快速剔除失效連線。 (Java 需改用 Oracle UCP 連線池才能完美支援) HA Events
RAC 專屬 執行階段負載平衡 根據 RAC 節點的回報(RLB),聰明地將新連線請求導向附載較低的節點。 (Java 需改用 Oracle UCP 連線池才能完美支援) Load Balancing

JAVA 連線範例

dataSource:
    dialect: org.hibernate.dialect.Oracle12cDialect
    logSql: false
    pooled: true
    url: jdbc:oracle:thin:@//127.0.0.1:1521/test
    properties:
        jmxEnabled: true
        initialSize: 5
        maxActive: 50
        minIdle: 5
        maxIdle: 25
        maxWait: 10000
        maxAge: 600000
        timeBetweenEvictionRunsMillis: 5000
        minEvictableIdleTimeMillis: 60000
        numTestsPerEvictionRun: 3
        validationQuery: SELECT 1
        validationQueryTimeout: 3
        validationInterval: 15000
        testOnBorrow: true
        testWhileIdle: true
        testOnReturn: false
        jdbcInterceptors: ConnectionState
        defaultTransactionIsolation: 2 # TRANSACTION_READ_COMMITTED
        connectionTimeout: 30000
        idleTimeout: 600000
        maxLifetime: 1800000
        minimumIdle: 10
        maximumPoolSize: 40

RAC 連線監控方式

SELECT 
    s.inst_id AS "RAC_Node_ID",
    i.instance_name AS "Instance_Name",
    s.machine AS "AP_Server",
    s.service_name AS "Service_Name",
    s.status AS "Session_Status",
    COUNT(*) AS "Session_Count",
    MIN(s.logon_time) AS "Oldest_Logon",
    MAX(s.logon_time) AS "Newest_Logon"
FROM 
    gv$session s
JOIN 
    gv$instance i ON s.inst_id = i.inst_id
WHERE 
    UPPER(s.machine) LIKE '%TEST%'
    -- 篩選特定的 RAC Service
    AND s.service_name = 'service_name'
GROUP BY 
    s.inst_id, i.instance_name, s.machine, s.service_name, s.status
ORDER BY 
    s.inst_id, s.machine, s.status;