JDBC 統一了 Java 訪問關係數據庫的 API,但各數據庫的驅動類名、URL 格式、連接參數差異巨大。本文匯總 Oracle、MySQL、PostgreSQL、SQL Server、DB2、Sybase 六大主流數據庫的標準連接配置,附帶連接池最佳實踐。
<!-- 驅動:com.mysql.cj.jdbc.Driver (8.0+) -->
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mydb?
useSSL=false&
serverTimezone=UTC&
characterEncoding=utf8mb4&
allowPublicKeyRetrieval=true&
rewriteBatchedStatements=true&
useServerPrepStmts=true"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
關鍵參數:rewriteBatchedStatements=true 開啟批次 SQL 重寫,性能提升 10 倍+;useServerPrepStmts=true 服務端預編譯。
<property name="driverClassName" value="org.postgresql.Driver"/>
<property name="url" value="jdbc:postgresql://localhost:5432/mydb?
currentSchema=public&
prepareThreshold=5&
preferQueryMode=extended"/>
<property name="username" value="postgres"/>
<property name="password" value="123456"/>
特色:支援 JSONB、數組、幾何類型、邏輯複製、豐富索引類型。
<!-- 瘦驅動 -->
<property name="driverClassName" value="oracle.jdbc.OracleDriver"/>
<!-- SID 模式 -->
<property name="url" value="jdbc:oracle:thin:@localhost:1521:ORCL"/>
<!-- 服務名模式 (推薦 RAC) -->
<property name="url" value="jdbc:oracle:thin:@//localhost:1521/service_name"/>
<!-- TNS 別名 -->
<property name="url" value="jdbc:oracle:thin:@my_tns_entry"/>
<property name="username" value="scott"/>
<property name="password" value="tiger"/>
依賴:ojdbc8.jar (JDK 8+),需從 Oracle 官網下載或配置 Maven 私服。
<!-- Microsoft 官方驅動 -->
<property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/>
<property name="url" value="jdbc:sqlserver://localhost:1433;
databaseName=mydb;
encrypt=true;
trustServerCertificate=true;
loginTimeout=30"/>
<property name="username" value="sa"/>
<property name="password" value="StrongPass123"/>
注意:默認端口 1433,命名實例需指定 instanceName 或動態端口。
<property name="driverClassName" value="com.ibm.db2.jcc.DB2Driver"/>
<property name="url" value="jdbc:db2://localhost:50000/MYDB:
currentSchema=SCOTT;
securityMechanism=3; -- 僅用戶名密碼
retrieveMessagesFromServerOnGetMessage=true;"/>
<property name="username" value="db2inst1"/>
<property name="password" value="password"/>
驅動包:db2jcc4.jar、db2jcc_license_cu.jar。
<property name="driverClassName" value="com.sybase.jdbc4.jdbc.SybDriver"/>
<property name="url" value="jdbc:sybase:Tds:localhost:5000/mydb?
SERVICENAME=ASE16&
CHARSET=utf8"/>
<property name="username" value="sa"/>
<property name="password" value="password"/>
<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource">
<property name="driverClassName" value="${jdbc.driver}"/>
<property name="jdbcUrl" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
<!-- 核心池大小:CPU 核心數 * 2 + 1 -->
<property name="maximumPoolSize" value="20"/>
<property name="minimumIdle" value="5"/>
<!-- 超時控制 -->
<property name="connectionTimeout" value="30000"/> -- 獲取連接超時 30s
<property name="idleTimeout" value="600000"/> -- 空閒回收 10min
<property name="maxLifetime" value="1800000"/> -- 最大壽命 30min
<property name="leakDetectionThreshold" value="60000"/> -- 洩漏檢測 1min
<!-- 連接測試 -->
<property name="connectionTestQuery" value="SELECT 1"/>
<property name="validationTimeout" value="5000"/>
<!-- 性能優化 -->
<property name="dataSourceProperties">
<props>
<prop key="cachePrepStmts">true</prop>
<prop key="prepStmtCacheSize">250</prop>
<prop key="prepStmtCacheSqlLimit">2048</prop>
</props>
</property>
</bean>
// 1. 定義數據源枚舉
public enum DataSourceType { MASTER, SLAVE_1, SLAVE_2 }
// 2. ThreadLocal 持有當前數據源
public class DynamicDataSourceContextHolder {
private static final ThreadLocal<DataSourceType> context = new ThreadLocal<>();
public static void set(DataSourceType type) { context.set(type); }
public static DataSourceType get() { return context.get(); }
public static void clear() { context.remove(); }
}
// 3. 繼承 AbstractRoutingDataSource
public class DynamicRoutingDataSource extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
return DynamicDataSourceContextHolder.get();
}
}
// 4. AOP 切面自動切換
@Aspect
@Component
public class DataSourceRoutingAspect {
@Before("@annotation(com.example.annotation.Master)")
public void master() { DynamicDataSourceContextHolder.set(DataSourceType.MASTER); }
@Before("@annotation(com.example.annotation.Slave)")
public void slave() { DynamicDataSourceContextHolder.set(DataSourceType.SLAVE_1); }
@After("@annotation(com.example.annotation.Master) || @annotation(com.example.annotation.Slave)")
public void clear() { DynamicDataSourceContextHolder.clear(); }
}
// 5. 使用註解聲明
@Service
public class OrderService {
@Master // 寫操作走主庫
public void createOrder(Order order) { ... }
@Slave // 讀操作走從庫
public Order getOrder(Long id) { ... }
}
| 錯誤現象 | 可能原因 | 解決方案 |
|---|---|---|
| ClassNotFoundException: Driver | 驅動包未導入/版本不匹配 | 檢查 Maven 依賴、JDBC 版本與 JDK 兼容性 |
| Communications link failure | 網絡不通/防火牆/數據庫未啟動/端口錯誤 | telnet ip port、檢查 bind-address、security group |
| Access denied for user | 用戶名密碼錯誤/權限不足/主機限制 | GRANT ALL ON db.* TO 'user'@'%' IDENTIFIED BY 'pwd'; FLUSH PRIVILEGES; |
| SSLHandshakeException | MySQL 8.0+ 默認 SSL/驅動版本過低 | useSSL=false 或配置信任憑證、升級驅動 |
| Connection reset / Broken pipe | 連接空閒超過數據庫 wait_timeout 被斷開 | HikariCP 配置 maxLifetime < wait_timeout、啟用 keepAlive |
| Public Key Retrieval is not allowed | MySQL 8.0 caching_sha2_password 插件 | allowPublicKeyRetrieval=true 或改用 mysql_native_password |
掌握六大數據庫的驅動類名、URL 參數語法、關鍵優化參數,配合HikariCP 統一連接池與動態路由 AOP,即可應對絕大多數異構數據庫集成場景。建議建立項目級JDBC 配置模板庫,新增數據源時直接複製調整,減少低級錯誤。